按下后退按钮时停止片段中的AsyncTask

时间:2012-07-06 09:34:04

标签: android

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

5 个答案:

答案 0 :(得分:12)

覆盖片段的onStop()并执行:

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

    //check the state of the task
    if(task != null && task.getStatus() == Status.RUNNING)
        task.cancel(true);
}

答案 1 :(得分: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
     }
 }

答案 2 :(得分:2)

我强烈建议您查看片段的this生命周期,以避免将来出现混淆。在你的情况下,我认为你应该覆盖onPause方法以覆盖asyncTask。

 @Override
protected void onPause() {
    super.onPause();
     //check the state of the task
    if(task != null && task.getStatus() == Status.RUNNING)
       task.cancel(true);
}

答案 3 :(得分:2)

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

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

    if(doTask != null){
        doTask.cancel(true);
    }
}

答案 4 :(得分:1)

    AsyncTaskRunner doAsynchronousTask; //Before onCreateView

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


// after  onCreateView()
    @Override
    public void onStop() {
        super.onStop();
        doAsynchronousTask.cancel(true);
    }