AsyncTaskLoader与AsyncTask的区别

130
自从出现了 Honeycombv4 兼容库,我们就可以使用 AsyncTaskLoader。据我所知,AsyncTaskLoader 可以在屏幕旋转等配置变化时仍然保持存活。

那么使用 AsyncTaskLoader 是否比使用 AsyncTask 更好呢?是否也涉及到使用 LoaderManager
但是我没有找到有关如何正确使用 AsyncTaskLoader 的好例子,文档中也没有提供任何示例。谁能提供一些好的例子呢?
4个回答

51

比较 AsyncTaskLoaderAsyncTask,你可能知道,当你旋转设备屏幕时,它可能会销毁并重新创建你的活动。为了更清楚地说明这一点,让我们想象一下在进行网络交易时旋转设备:

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

AsyncTaskLoader 将基于之前注册在 Loader 管理器中的 Loader ID 进行重用,因此避免了重新执行网络事务。

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


51
您可以查看兼容性库的源代码以获取更多信息。一个 FragmentActivity 的作用是:
  • 保存一个 LoaderManager 列表
  • 通过使用onRetainNonConfigurationInstance()保存实例,以确保它们在您翻转手机(或发生其他配置更改)时不会被销毁
  • 在您的 Activity 中调用 initLoader() 时启动正确的 loader
您需要使用 LoaderManager 来接口操作加载器,并提供所需的回调来创建您的 loader(s) 并使用其返回的数据填充您的视图。
通常情况下,相比自行管理 AsyncTask,使用 LoaderManager 应该更容易。但是,AsyncTaskLoader 的文档并不是非常好,因此您应该研究文档中的示例和/或基于 CursorLoader 来编写您的代码。

5
我会查看这个。也许现在找到关于AsyncTaskLoader的好例子还为时过早,当更多的开发者开始使用它时,会有更多的例子出现。 - OKA

11

AsyncTaskLoaderAsyncTask 有相同的功能,但更加优秀。它可以更容易地处理 Activity 配置更改,并在 Fragment 和 Activity 的生命周期内运行。优美的是,任何应用了 AsyncTask 的情况都可以使用 AsyncTaskLoader。每当需要将数据加载到内存中供 Activity/Fragment 处理时,AsyncTaskLoader 可以更好地完成工作。

然而,使用 AsyncTasks 会遇到以下几个问题:

  • 配置更改可能会出现问题
  • 暂停 Activity 并不会暂停 AsyncTask
  • 需要大量样板代码(意味着可能出现更多错误)

AsyncTaskLoader 文档


8
除了其他答案中描述的区别外,还有以下几点:
使用AsyncTaskLoader相比AsyncTask时:
  • AsyncTaskLoader允许我们在新数据通过forceLoad()返回之前加载旧的缓存数据。

  • 我们可以使用setUpdateThrottle()设置延迟时间,以防止连续更新到客户端(Activity/Fragment)。

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

  • AsyncTaskLoader在链接的活动不可用时,会被LoaderManger销毁。而我们需要手动销毁AsyncTasks,如果它的调用活动已经被销毁。这样可以省去我们编写所有清除内容的时间。 AsyncTaskLoader与它们各自的生命周期很好地协同工作。

因此,AsyncTaskLoader比AsyncTask更优秀。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接