在我的片段中,我有2个AsyncTasks在不断运行。要求是当用户使用Drawer菜单切换到不同的框架时,应取消这些任务。但是,当用户按下主页按钮时,这些任务应该继续运行。
我在该片段中使用了以下代码:
@Override
public void onStop() {
super.onStop();
if(asyncTripWaiter != null && asyncTripWaiter.getStatus() == AsyncTask.Status.RUNNING)
asyncTripWaiter.cancel(true);
if(asyncTripTracker != null && asyncTripTracker.getStatus() == AsyncTask.Status.RUNNING)
asyncTripTracker.cancel(true);
}
问题是即使按下主页按钮,这段代码也会执行。如何在切换片段时使其生效。
答案 0 :(得分:1)
不是那么简单,
请考虑当您的片段返回堆栈时的情况,然后您可以访问方法onPause()
和onStop()
。
当AsyncTask
仍在运行时,用户可以在一秒钟内返回此片段。
那么再次调用AsyncTask
可能效率不高。
实际上有两种选择,
第一个是同步架构解决方案,当您将模型与可见片段分开同步时,您不必取消AsyncTask
,但它需要更改您的应用程序逻辑。
你可以听到它
Android Application Architecture (Android Dev Summit 2015)正如讲师所说,你拥有什么样的架构并不是那么重要,但重要的是你如何处理数据加载和缓存。
因此,第一个选项是将数据与片段和活动分开缓存。
第二个选项是让你的AsyncTask
保持活跃状态,但是检查是否为活动分段和/或缓存数据,即使它不是。用户可以稍后返回此片段。
当fragment
为destroyed
时,这不会发生,因此您可以倾听onDestroy
方法并设置destroyed = true;
之类的标记。
当AsyncTask
返回时,您可以查看
if (!destroyed) {
// do your job
}
答案 1 :(得分:0)
你可以这样试试
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (!isVisibleToUser) {
if(asyncTripWaiter != null && asyncTripWaiter.getStatus() == AsyncTask.Status.RUNNING)
asyncTripWaiter.cancel(true);
if(asyncTripTracker != null && asyncTripTracker.getStatus() == AsyncTask.Status.RUNNING)
asyncTripTracker.cancel(true);
}
}
setUserVisibleHint()是片段类的覆盖方法。
答案 2 :(得分:0)
由于您只需要在切换时取消,因此执行此操作的一种方法是公开fragment
的一些公共函数。
片段的切换很可能发生在activity
中,所以在替换之前,调用片段的暴露函数来取消 asynctask 。
e.g
在你的片段中:
public void cancelAllTasks(){
// your logic to cancel tasks
}
活动:
yourFragment.cancelAllTasks();
...
replaceAnotherFragmentCode();