2010-08-17 66 views
1

PrintStatusTask解析gmail收件箱的内容,查找各种感兴趣的项目以进行报告。但是根据调试器为每个PrintStatusTask()。execute()创建一个新的AsyncTask。这些任务不应该退出?他们是否必须手动杀死?杀死Android 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); 
     } 
    } 
} 

回答

0

如果你到任务的参考周围,你可以调用它的cancel方法来取消它。否则,只要您的应用程序执行此操作,或直到它们从doInBackground和(如果存在)onPostExecute函数返回,它们就会生效。

+0

PrintStatusTask在任务完成后退出。但是,在PrintStatusTask(请参阅更新后的代码片段)中添加 this.cancel(true)到onPostExecute()也不会终止该任务。我猜想任务会在电池耗尽并且设备关闭后消失,但不喜欢该解决方法。任何其他想法? – jacknad 2010-08-17 23:01:53

+1

在'onPostExecute'中调用'cancel'是无用的,因为只有在任务完成或被取消后才会调用cancel。你必须在别处叫它。例如,如果您在创建Activity时将“AsyncTask”字段添加到“Activity”并将任务保存在那里,那么稍后可以在活动的“onDestroy”上执行“mPrintTask.cancel”(如果适用)。当然,您必须先选择任务的生命周期,然后才能找到适当的地方来取消它。 – 2010-08-18 00:55:10

+0

这就是我的想法。除了onPostExecute被调用,但AsyncTask仍然显示为在调试窗口中运行。这可能是Eclipse/Android环境中的一个缺陷,即使任务已经真正退出,它也不能从调试窗口中正确删除AsyncTask指示? – jacknad 2010-08-18 11:18:02

5

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

通过调用取消(布尔值)引述的AsyncTask

任务可以在任何时间被取消的文档。调用此方法将导致对isCancelled()的后续调用返回true。调用此方法后,onCancelled(Object)将在doInBackground(Object [])返回后调用,而不是onPostExecute(Object)。为了确保任务是尽可能快地取消,应始终从doInBackground检查isCancelled(返回值)定期(对象[]),如果可能的话(例如在一个循环中。)

阅读文档可以是有用的...所以我总结它为你,但因为我已经在另一篇文章中回答,我发送给你:How can I make asynchronous URL connections on Android?

我给你的问题的解决方法,是的,有些时间,一些AsyncTask被杀害。但我不会推荐使用它们,它们是无用的。但是,既然你的AsyncTasks运行应该显示一个“等待”状态,如果他们完成了任务。否则,你的任务没有完成,我从来没有听说过一些adb线程看bug。

问候!

+0

嗨,也许你提供的链接是错误的,因为我在你链接的文章中看不到你的回答。无论如何....可以在'doInBackground()'方法内调用'isCancelled()'解决问题吗? – ocramot 2015-04-19 12:38:26