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