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

问题描述:

我有一个宿主片段的活动。按下按钮通过FragmentTransaction从片段A转到片段B,并将其添加到后端堆栈。现在片段B有一个AsyncTask实现,它从SD卡加载图像并在加载图像时发布它。如果我按下后退按钮,我的应用程序崩溃。 。错误报告表明异步任务是问题,因为当按下“后退”按钮时它仍然在加载,所以我的问题是,我怎样才能停止AsyncTask,当后退按钮被按下以返回到先前片段/活动?..谢谢。当按下后退按钮时停止片段中的AsyncTask

覆盖您的片段的onStop()和做:

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

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

你的意思是在包含的AsyncTask吧?片段.. – irobotxxx 2012-07-06 09:41:54

+0

是的,片段... – Nermeen 2012-07-06 09:45:44

+0

感谢它的作品! – irobotxxx 2012-07-06 09:55:24

只需拨打这个代码在你的主机活动的onBackPressed() - 方法 - 通过同样适用onDestroy()一个片段:

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

这将为您取消正在运行的AsyncTask。一定要检查回到的AsyncTask如果不使用生命周期的方法取消:

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

我强烈建议你看片段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); 
} 

AsyncTaskRunner doAsynchronousTask; //Before onCreateView 

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


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

我认为如果你给你的答案添加一个解释会更好,这样会更容易理解。 – Keale 2014-10-22 07:48:28

+0

全局声明AsyncTask方法。在oncreatview()或onActivityCreated()方法中执行这个异步任务。然后,最后复制onStop()方法 – 2014-10-22 08:05:59

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

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

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