替换片段时停止AsyncTask

时间:2016-10-23 08:00:45

标签: android android-fragments android-asynctask

在我的片段中,我有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);
} 

问题是即使按下主页按钮,这段代码也会执行。如何在切换片段时使其生效。

3 个答案:

答案 0 :(得分:1)

不是那么简单, 请考虑当您的片段返回堆栈时的情况,然后您可以访问方法onPause()onStop()。 当AsyncTask仍在运行时,用户可以在一秒钟内返回此片段。 那么再次调用AsyncTask可能效率不高。

实际上有两种选择, 第一个是同步架构解决方案,当您将模型与可见片段分开同步时,您不必取消AsyncTask,但它需要更改您的应用程序逻辑。 你可以听到它 Android Application Architecture (Android Dev Summit 2015)正如讲师所说,你拥有什么样的架构并不是那么重要,但重要的是你如何处理数据加载和缓存。

因此,第一个选项是将数据与片段和活动分开缓存。

第二个选项是让你的AsyncTask保持活跃状态​​,但是检查是否为活动分段和/或缓存数据,即使它不是。用户可以稍后返回此片段。

fragmentdestroyed时,这不会发生,因此您可以倾听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();