如何在具有相同片段的选项卡中正确管理 ASynkTaks class
How to correctly manage ASynkTaks in Tabs which have the same fragment class
我有一个带有 7 个选项卡的 FragmentActivity,它们都引用同一个片段,唯一的区别是一个参数,它使它们通过 ASyncTask 加载数据以显示 PHP returns一个JSON。我的问题是,当我从一个选项卡滑动到另一个选项卡时,如果第一个选项卡中的任务仍在加载,它会加载到新选项卡中,或者崩溃,或者什么都不做。但是,activity 加载了两个选项卡,因此任务启动了两次并且是同一个问题。有什么想法吗?
保留对 AsyncTask 的引用。我假设您有一个回调,让您知道选项卡何时更改。当您收到选项卡已更改的通知时,您可以检查您的 AsyncTask 是否为空或尚未完成,如果不是,则调用它的 cancel() 方法。
if(asyncTask!=null && asyncTask.getStatus()!=AsyncTask.Status.FINISHED) {
asyncTask.cancel(false);
asyncTask = null;
}
虽然 AsyncTasks 很棒,但它们旨在成为独立于任何 UI 的过程(例如保存信息)。在最长的时间里,我在同一条船上使用 AsyncTasks 来完成最终会改变 UI 的工作(因为嘿,他们有一个 onPost 方法)。
对于任何会影响 UI 的工作,您应该使用的是 Loader,它将关注片段的 UI 状态。在您的情况下,AsyncTask 可能正在尝试访问不再存在的 UI 元素(查看寻呼机仅在内存中保留上一个、当前和下一个视图)。 Loader 会注意这一点,不会尝试更改 UI.
网络上有很多示例,但简而言之,您需要为每个 AsyncTasks(我推荐 AsyncTaskLoader, if you do pay attention to forceLoad) and add the callbacks (LoaderManager.LoaderCallbacks)创建(扩展)一个加载程序到您的 Fragment。然后当你准备加载调用 getLoaderManager().restartLoader(LOADER_ID, bundle_args, loader_callback);
我有一个带有 7 个选项卡的 FragmentActivity,它们都引用同一个片段,唯一的区别是一个参数,它使它们通过 ASyncTask 加载数据以显示 PHP returns一个JSON。我的问题是,当我从一个选项卡滑动到另一个选项卡时,如果第一个选项卡中的任务仍在加载,它会加载到新选项卡中,或者崩溃,或者什么都不做。但是,activity 加载了两个选项卡,因此任务启动了两次并且是同一个问题。有什么想法吗?
保留对 AsyncTask 的引用。我假设您有一个回调,让您知道选项卡何时更改。当您收到选项卡已更改的通知时,您可以检查您的 AsyncTask 是否为空或尚未完成,如果不是,则调用它的 cancel() 方法。
if(asyncTask!=null && asyncTask.getStatus()!=AsyncTask.Status.FINISHED) {
asyncTask.cancel(false);
asyncTask = null;
}
虽然 AsyncTasks 很棒,但它们旨在成为独立于任何 UI 的过程(例如保存信息)。在最长的时间里,我在同一条船上使用 AsyncTasks 来完成最终会改变 UI 的工作(因为嘿,他们有一个 onPost 方法)。
对于任何会影响 UI 的工作,您应该使用的是 Loader,它将关注片段的 UI 状态。在您的情况下,AsyncTask 可能正在尝试访问不再存在的 UI 元素(查看寻呼机仅在内存中保留上一个、当前和下一个视图)。 Loader 会注意这一点,不会尝试更改 UI.
网络上有很多示例,但简而言之,您需要为每个 AsyncTasks(我推荐 AsyncTaskLoader, if you do pay attention to forceLoad) and add the callbacks (LoaderManager.LoaderCallbacks)创建(扩展)一个加载程序到您的 Fragment。然后当你准备加载调用 getLoaderManager().restartLoader(LOADER_ID, bundle_args, loader_callback);