如何正确管理具有相同片段类的选项卡中的ASynkTaks

时间:2015-01-19 17:49:35

标签: android android-fragments android-asynctask tabs

我有一个带有7个选项卡的FragmentActivity,并且它们都引用相同的片段,唯一的区别是一个参数,这使得它们通过ASyncTask加载从返回JSON的PHP中显示的数据。我的问题是,当我从一个选项卡滑动到另一个选项卡时,如果第一个选项卡中的任务仍在加载,则会在新选项卡中加载,或者崩溃,或者什么都不做。但是,活动会加载两个选项卡,因此任务启动两次并且是同一个问题。有什么想法吗?

2 个答案:

答案 0 :(得分:0)

保留AsyncTask的引用。我假设你有一个回调,让你知道标签何时发生了变化。当您收到选项卡已更改的通知时,您可以检查AsyncTask是否为空或尚未完成,如果不是,则称之为cancel()方法。

if(asyncTask!=null && asyncTask.getStatus()!=AsyncTask.Status.FINISHED) {
    asyncTask.cancel(false);
    asyncTask = null;
}

答案 1 :(得分:0)

虽然AsyncTasks很棒,但它们的目的是独立于任何UI(例如保存信息)。最长的时间我在同一条船上并使用AsyncTasks进行最终改变UI的工作(因为嘿,他们有一个onPost方法)。

对于任何会影响UI的工作,您应该使用的是Loader,它将关注片段的UI状态。在您的情况下,AsyncTask可能正在尝试访问不再存在的UI元素(View Pagers仅保留内存中的先前,当前和下一个视图)。 Loader将注意这一点,而不是尝试更改UI。

网上有很多例子,但总之,你需要为每个AsyncTasks创建(扩展)一个Loader(我推荐AsyncTaskLoader,如果你注意forceLoad })并将回调(LoaderManager.LoaderCallbacks)添加到您的片段。然后,当您准备加载呼叫getLoaderManager().restartLoader(LOADER_ID, bundle_args, loader_callback);