129

由于Honeycombv4 Compatibility Library可以使用AsyncTaskLoader. 据我了解,AsyncTaskLoader可以通过屏幕翻转等配置更改生存。

是否建议使用AsyncTaskLoader代替AsyncTask?也进图吗LoaderManager

但是我还没有找到任何关于如何正确使用AsyncTaskLoader. 文档也没有提供示例。谁能提供一些很好的例子。

4

4 回答 4

51

您可以查看兼容性库的源代码以获取更多信息。a 的FragmentActivity作用是:

  • 保留LoaderManager's的列表
  • 通过使用保存实例,确保在翻转手机(或发生其他配置更改)时它们不会被破坏onRetainNonConfigurationInstance()
  • initLoader()当你调用你的活动时踢正确的加载器

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

一般来说,它应该比管理AsyncTask自己更容易。但是,AsyncTaskLoader它的文档并不完全清楚,因此您应该研究文档中的示例和/或在CursorLoader.

于 2011-08-19T14:10:51.097 回答
50

当比较AsyncTaskLoaderAsyncTask时,您可能知道当您旋转设备屏幕时,它可能会破坏并重新创建您的活动,以明确让图像在网络事务进行时旋转您的设备:

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

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

综上所述, AsyncTaskLoader防止了后台线程的重复,杜绝了僵尸活动的重复。

于 2017-01-13T09:37:27.007 回答
11

AsyncTaskLoader执行与AsyncTask相同的功能,但要好一些。它可以更轻松地处理 Activity 配置更改,并且它在 Fragment 和 Activity 的生命周期内运行。好消息是 AsyncTaskLoader 可以在使用 AsyncTask 的任何情况下使用。每当需要将数据加载到内存中以供 Activity/Fragment 处理时,AsyncTaskLoader 可以更好地完成这项工作。

但是,使用 AsyncTasks 存在一些问题:

  • 配置更改可能会搞砸
  • 暂停活动不会暂停 AsyncTask
  • 相当多的样板代码(这意味着更多可能的错误)

AsyncTaskLoader 文档

于 2016-09-27T13:47:23.730 回答
8

除了其他答案中描述的一些差异:

AsyncTask上使用AsyncTaskLoader时:

  • AsyncTaskLoader让我们可以自由加载旧的缓存数据,直到新数据返回forceLoad()

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

  • 如果AsyncTaskLoader有共同的父 Activity 并且从getActivity().getSupportLoaderManager()

  • AsyncTaskLoaderLoaderManger在其链接的活动不再可用时被销毁。而如果AsyncTasks的调用者活动被破坏,我们需要手动销毁它。这节省了我们编写所有清算内容的时间。AsyncTaskLoader 在各自的生命周期中运行良好。

所以,AsyncTaskLoader 比 AsyncTask 好得多。

于 2018-02-18T06:25:21.170 回答