是什么杀死了Android AsyncTask?

时间:2010-08-17 22:14:12

标签: android android-asynctask

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);
        }   
    }
}

3 个答案:

答案 0 :(得分:5)

我找到了一个很好的答案here

答案 1 :(得分:5)

好的,我很抱歉,但我必须告诉你,你错了。 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线程监视错误。

问候!

答案 2 :(得分:1)

如果您保留对任务的引用,可以调用其cancel方法取消它。否则,只要您的应用进程执行,或者直到他们从doInBackground和(如果存在)onPostExecute函数返回,它们就会存在。