我有一个托管片段的活动。按下按钮通过 FragmentTransaction 从片段 A 到片段 B 并添加到后台堆栈。现在片段 B 有一个 AsyncTask 实现,它从 sdcard 加载图像并在加载图像时发布它。如果我按下返回按钮,我的应用程序会崩溃。. 错误报告表明异步任务是问题,因为按下后退按钮时它仍在加载,所以我的问题是,当按下后退按钮返回到上一个时,我该如何或应该在哪里停止 AsyncTask片段/活动?...谢谢。
问问题
6606 次
5 回答
12
覆盖片段的 onStop() 并执行以下操作:
protected void onStop() {
super.onStop();
//check the state of the task
if(task != null && task.getStatus() == Status.RUNNING)
task.cancel(true);
}
于 2012-07-06T09:39:19.683 回答
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
}
}
于 2012-07-06T09:39:37.120 回答
2
我强烈建议您查看片段的这个生命周期以避免将来的混淆。在你的情况下,我认为你应该重写 onPause 方法来顶部 asyncTask。
@Override
protected void onPause() {
super.onPause();
//check the state of the task
if(task != null && task.getStatus() == Status.RUNNING)
task.cancel(true);
}
于 2012-07-06T09:47:19.947 回答
2
在 onStop() 中取消 AsyncTask 不是一个很好的选择,因为它可以在您希望 AsyncTask 继续运行的情况下停止它。想象一下,您有一个片段/活动,其中显示了从网络下载的几张图像,并且点击图像应该将用户带到另一个特定于图像的应用程序。这将使您的片段点击 onStop() 并取消您的 AsyncTask,即使当用户返回活动时可能仍有您想要下载的图像。我认为在 onDestroy() 中这样做是一个更好的选择。
@Override
public void onDestroy() {
super.onDestroy();
if(doTask != null){
doTask.cancel(true);
}
}
于 2017-01-25T17:13:26.717 回答
1
AsyncTaskRunner doAsynchronousTask; //Before onCreateView
//in onCreateView()
doAsynchronousTask = new AsyncTaskRunner();``
doAsynchronousTask.execute();
// after onCreateView()
@Override
public void onStop() {
super.onStop();
doAsynchronousTask.cancel(true);
}
于 2014-10-22T07:41:48.747 回答