繁体   English   中英

当按下“后退”按钮时,在片段中停止AsyncTask

[英]Stop AsyncTask in Fragments when Back Button is pressed

我有一个托管碎片的活动。 按下按钮通过FragmentTransaction从片段A到片段B,然后将其添加到后堆栈。 现在,片段B具有AsyncTask实现,该实现从sdcard加载图像并在加载图像时将其发布。 如果我按“后退”按钮,我的应用程序将崩溃。 错误报告指示异步任务是问题,因为当按下“后退”按钮时它仍在加载,所以我的问题是,当按下“后退”按钮以返回到前一个任务时,我该如何停止我的工作?片段/活动?。谢谢。

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

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

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

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

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

这将为您取消正在运行的AsyncTask。 如果使用生命周期方法未取消AsyncTask,请确保再次检查它:

protected void onPostExecute(Long result) {
     if(!isCancelled()) {
       // do your work
     }
 }

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

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

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

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

    if(doTask != null){
        doTask.cancel(true);
    }
}
    AsyncTaskRunner doAsynchronousTask; //Before onCreateView

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


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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM