![](/img/trans.png)
[英]Android - Stop AsyncTask when back button is pressed and return to previous Activity
[英]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.