1

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

2 回答 2

5

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

引用自 AsyncTask 的文档

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

阅读文档可能很有用...所以我会为您总结一下,但由于我已经在另一篇文章中回答过,我将您发送给它:如何在 Android 上建立异步 URL 连接?

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

问候 !

于 2011-10-29T18:09:01.363 回答
1

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

于 2010-08-17T22:17:05.107 回答