【问题标题】:How to cancel AsyncTask when Activity finishes?Activity 完成时如何取消 AsyncTask?
【发布时间】:2010-03-28 14:02:43
【问题描述】:

在我的 Activity 中,我使用了多个 AsyncTask 类。

Activity结束时如何取消AsyncTask?

【问题讨论】:

标签: android multithreading android-activity android-asynctask


【解决方案1】:

我认为最好的地方是onStop

protected void onStop() {
    super.onStop();

    /*
    * The device may have been rotated and the activity is going to be destroyed
    * you always should be prepared to cancel your AsnycTasks before the Activity
    * which created them is going to be destroyed.
    * And dont rely on mayInteruptIfRunning
    */
    if (this.loaderTask != null) {
        this.loaderTask.cancel(false);
    }
}

在我的任务中,我会尽可能频繁地检查是否调用了 cancel

protected String doInBackground(String... arg0) {
    if (this.isCancelled()) {
        return null;
    }
}

当然不要忘记删除可能返回的数据,因为没有更多的 Activity 可以接收它

protected void onPostExecute(List<UserStatus> result) {
    if(!this.isCancelled()) {
        //pass data to receiver
    }
}

【讨论】:

  • onPostExecute 永远不会在 isCancelled 设置为 true 的情况下被调用。而是调用 onCancelled(Object)
【解决方案2】:

我不明白您的“取消”是否意味着回滚,但您在 AsyncTask 类上有一个 cancel 方法。

【讨论】:

  • 任务完成后我希望它消失。
【解决方案3】:

asynctask 线程在线程池中保持活动状态,以供将来的 AsyncTask 使用。您无法删除它们。

【讨论】:

  • 虽然这可能是真的,但问题是关于取消任务,而不是摆脱它的线程。
  • 注意@Pentium10 在接受的答案中的评论 - 他希望“任务”(我相信意思是“线程”)“消失。这就是为什么我认为这个答案是最好的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多