【问题标题】:What kills an Android AsyncTask? [duplicate]是什么杀死了 Android AsyncTask? [复制]
【发布时间】:2010-08-17 22:14:11
【问题描述】:

PrintStatusTask 解析 gmail 收件箱的内容,寻找各种感兴趣的项目进行报告。但是根据调试器为每个 PrintStatusTask().execute() 创建一个新的 AsyncTask。这些任务不应该在退出时死掉吗?必须手动杀死吗?

public class Controller extends Activity {
    ...
    private boolean applyMenuChoice(MenuItem item) {
        switch (item.getItemId()) {
        case R.id.menuStatus:
            new PrintStatusTask().execute();
            ...
    class PrintStatusTask extends AsyncTask<Void, String, Void> {
        @Override
        protected Void doInBackground(Void... unused) {
            ...
            return null;
        }
        @Override
        protected void onPostExecute(Void unused) {
            this.cancel(true);
        }   
    }
}

【问题讨论】:

    标签: android android-asynctask


    【解决方案1】:

    好吧,伙计们,我很抱歉,但我必须告诉你,你错了。 AsyncTask (几乎)永远不会被杀死。调用 AsyncTask.cancel 不会终止任务。

    引用自 AsyncTask 的文档

    可以通过调用 cancel(boolean) 随时取消任务。调用此方法将导致对 isCancelled() 的后续调用返回 true。调用此方法后,将在 doInBackground(Object[]) 返回后调用 onCancelled(Object),而不是 onPostExecute(Object)。为了确保尽快取消任务,如果可能(例如在循环中),您应该始终定期从 doInBackground(Object[]) 检查 isCancelled() 的返回值。

    阅读文档可能很有用...所以我会为您总结一下,但是由于我已经在另一篇文章中回答了,所以我将您发送给它:How can I make asynchronous URL connections on Android?

    我为您的问题提供了一种解决方法,是的,有一段时间,一些 AsyncTask 被杀死了。但我不建议使用它们,它们没用。但是因为,如果您的 AsyncTasks 完成了任务,它们正在运行应该显示“等待”状态。否则你的任务还没有完成,而且我从来没有听说过一些 adb 线程监视错误。

    问候!

    【讨论】:

    • 您好,您提供的链接可能是错误的,因为我在您链接的帖子中看不到您的答案。无论如何....可以在doInBackground() 方法中调用isCancelled() 解决问题吗?
    【解决方案2】:

    如果你保留对任务的引用,你可以调用它的cancel 方法来取消它。否则,它们将与您的应用程序的进程一样长,或者直到它们从 doInBackground 和(如果存在)onPostExecute 函数返回。

    【讨论】:

    • PrintStatusTask 在任务完成后退出。但是将 this.cancel(true) 添加到 PrintStatusTask 中的 onPostExecute() (请参阅更新的 sn-p)也不会终止任务。我想任务会在耗尽电池并且设备关闭后消失,但不喜欢这种解决方法。还有其他想法吗?
    • onPostExecute 中调用cancel 是没有用的,因为只有在任务完成或取消后才会调用它。你必须在别处调用它。例如,如果您将AsyncTask 字段添加到您的Activity 并在创建任务时将其保存在那里,您可以稍后在您的活动的onDestroy 上执行mPrintTask.cancel,如果合适的话。当然,您必须先选择任务的生命周期,然后才能找到合适的位置取消它。
    • 我就是这么想的。除了 onPostExecute 确实被调用,但 AsyncTask 仍然显示为在调试窗口中运行。这可能是 Eclipse/Android 环境中的一个缺陷,即使任务实际上已经退出,也没有从调试窗口中正确删除 AsyncTask 指示?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多