0

我有一个托管片段的活动。按下按钮通过 FragmentTransaction 从片段 A 到片段 B 并添加到后台堆栈。现在片段 B 有一个 AsyncTask 实现,它从 sdcard 加载图像并在加载图像时发布它。如果我按下返回按钮,我的应用程序会崩溃。. 错误报告表明异步任务是问题,因为按下后退按钮时它仍在加载,所以我的问题是,当按下后退按钮返回到上一个时,我该如何或应该在哪里停止 AsyncTask片段/活动?...谢谢。

4

5 回答 5

12

覆盖片段的 onStop() 并执行以下操作:

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

    //check the state of the task
    if(task != null && task.getStatus() == Status.RUNNING)
        task.cancel(true);
}
于 2012-07-06T09:39:19.683 回答
2

只需在托管活动的onBackPressed()方法中调用此代码- 同样适用于通过onDestroy()的片段:

if(myFancyAsyncTask != null && myFancyAsyncTask.getStatus() == Status.RUNNING) {
  myFancyAsyncTask.cancel(true);
}

这将为您取消正在运行的 AsyncTask。如果没有使用生命周期方法取消,请务必检查 AsyncTask:

protected void onPostExecute(Long result) {
     if(!isCancelled()) {
       // do your work
     }
 }
于 2012-07-06T09:39:37.120 回答
2

我强烈建议您查看片段的这个生命周期以避免将来的混淆。在你的情况下,我认为你应该重写 onPause 方法来顶部 asyncTask。

 @Override
protected void onPause() {
    super.onPause();
     //check the state of the task
    if(task != null && task.getStatus() == Status.RUNNING)
       task.cancel(true);
}
于 2012-07-06T09:47:19.947 回答
2

在 onStop() 中取消 AsyncTask 不是一个很好的选择,因为它可以在您希望 AsyncTask 继续运行的情况下停止它。想象一下,您有一个片段/活动,其中显示了从网络下载的几张图像,并且点击图像应该将用户带到另一个特定于图像的应用程序。这将使您的片段点击 onStop() 并取消您的 AsyncTask,即使当用户返回活动时可能仍有您想要下载的图像。我认为在 onDestroy() 中这样做是一个更好的选择。

@Override
public void onDestroy() {
    super.onDestroy();

    if(doTask != null){
        doTask.cancel(true);
    }
}
于 2017-01-25T17:13:26.717 回答
1
    AsyncTaskRunner doAsynchronousTask; //Before onCreateView

//in onCreateView() 
    doAsynchronousTask = new AsyncTaskRunner();``
    doAsynchronousTask.execute();


// after  onCreateView()
    @Override
    public void onStop() {
        super.onStop();
        doAsynchronousTask.cancel(true);
    }
于 2014-10-22T07:41:48.747 回答