当按下后退按钮时停止片段中的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);
}
只需拨打这个代码在你的主机活动的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);
}
我认为如果你给你的答案添加一个解释会更好,这样会更容易理解。 – Keale 2014-10-22 07:48:28
全局声明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);
}
}
你的意思是在包含的AsyncTask吧?片段.. – irobotxxx 2012-07-06 09:41:54
是的,片段... – Nermeen 2012-07-06 09:45:44
感谢它的作品! – irobotxxx 2012-07-06 09:55:24