AsyncTaskLoader 与 AsyncTask

由于 Honeycombv4 Compatibility Library,使用 AsyncTaskLoader是可能的。据我所知,AsyncTaskLoader可以通过配置变化(如屏幕翻转)生存下来。

是否建议使用 AsyncTaskLoader而不是 AsyncTask? LoaderManager也在图片中吗?

但是我还没有找到任何关于如何正确使用 AsyncTaskLoader的好例子。文件也没有提供任何例子。有人能提供一些好的例子吗。

51790 次浏览

你可以查看兼容库的源代码来获得更多信息。 FragmentActivity的功能是:

  • 保存一份 LoaderManager的清单
  • 通过使用 onRetainNonConfigurationInstance()保存实例,确保在翻转手机(或者发生其他配置更改)时不会损坏它们
  • 在活动中调用 initLoader()时踢右边的加载程序

您需要使用 LoaderManager与加载程序进行接口,并提供所需的回调来创建加载程序并用它们返回的数据填充视图。

一般来说,这应该比自己管理 AsyncTask更容易。但是,AsyncTaskLoader并没有很好的文档,所以您应该在文档中学习这个例子,并且/或者在 CursorLoader之后对代码进行建模。

AsyncTaskLoader 执行与 AsyncTask相同的功能,但稍好一些。它可以更容易地处理活动配置更改,并且在片段和活动的生命周期内运行。好处是,AsyncTaskLoader 可以在使用 AsyncTask 的任何情况下使用。任何时候需要将数据加载到内存中以便 Activity/Fragment 处理时,AsyncTaskLoader 都可以更好地完成这项工作。

不过,使用 AsyncTasks 存在一些问题:

  • 配置更改可能会把事情搞砸
  • 暂停某个活动并不会暂停 AsyncTask
  • 大量的样板代码(这意味着更多可能的错误)

AsyncTaskLoader 文档

当比较 AsyncTaskLoaderAsyncTask时,你可能知道当你旋转你的设备屏幕时,它可能会破坏和重新创建你的活动,使其清晰,让图像旋转你的设备,而网络交易正在进行:

AsyncTask 将再次作为后台线程执行,之前的后台线程处理只是冗余和僵尸。

AsyncTaskLoader 将根据以前在 Loader Manager 中注册的 Loader ID 重用,因此避免重新执行网络事务。

总之,AsyncTaskLoader可以防止后台线程的重复,并消除僵尸活动的重复。

除了其他答案所描述的以外,还有一些不同之处:

AsyncTask上使用 AsyncTaskLoader:

  • AsyncTaskLoader 允许我们加载旧的缓存数据,直到 forceLoad()返回新数据

  • 我们可以通过 setUpdateThrottle()将延迟设置为 AsyncTaskLoader,这样可以防止连续更新到客户端(Activity/Fragment)

  • 如果 AsyncTaskLoader 具有共同的父活动,并且是从 getActivity().getSupportLoaderManager()启动的,那么它可以共享给多个片段

  • 当其链接的活动不再可用时,AsyncTaskLoader 将被 LoaderManger销毁。而我们需要手动破坏 异步任务如果它的调用者活动破坏。这样可以节省我们写清理材料的时间。AsyncTaskLoader 可以很好地处理它们各自的生命周期。

因此,AsyncTaskLoader 比 AsyncTask 好得多。