CursorLoader 和 AsyncTaskLoader 的区别

Difference between CursorLoader and AsyncTaskLoader

为什么我应该使用 AsyncTaskLoader,什么时候应该使用 CursorLoader,反之亦然?

官方page给出了App-listing的例子,这里用的是AsyncTaskLoader而不是CursorLoader

这两个有什么优缺点?我在某处读到 CursorLoader 不关心内容更改(在 sqlite 中)。

谢谢!

AsyncTaskLoader 是 Loader 的一个特定子class。 class 执行与 AsyncTask 相同的功能,但更好一些。 不过,使用 AsyncTasks 存在一些问题:

配置更改可能会把事情搞砸 暂停 activity 不会暂停 AsyncTask 相当数量的样板代码(这意味着更多可能的错误)

它可以更轻松地处理 Activity 配置更改,并且它在 Fragments 和 Activity 的生命周期内运行。好处是 AsyncTaskLoader 可以在任何使用 AsyncTask 的情况下使用。任何时候需要将数据加载到内存中以供 Activity/Fragment 处理,AsyncTaskLoader 可以更好地完成这项工作。

Loader 的美妙之处在于它处理了一些在使用 AsyncTask 时通常会遗漏的“陷阱”。主要是处理activity配置变化(IE当用户旋转屏幕时)。

另一方面,CursorLoader 在 Android 中使用 Cursors 拉取数据时非常出色。加载程序 class 在底层数据发生变化时可以很好地更新游标信息(进而更新 UI)。当信息经常变化并且您不想打断 UI 时,这非常有用,无论用户当前正在做什么,只是为了显示一些新信息。

AsyncTaskLoader 是一个抽象加载器,它提供一个 AsyncTask 来执行 work.So 您通常扩展 AsyncTaskLoader 以创建您自己的自定义 loader.The 使用 AsyncTask 和使用 AsyncTaskloader 的主要区别在于配置更改(例如方向更改)不会影响 AsyncTaskLoader 及其进程,因为 AsyncTaskLoader 有自己的生命周期;而配置更改会对 AsyncTask 产生不利影响,因为它连接到主机 activity 的生命周期。

CursorLoader 是一个查询 ContentResolver 的加载器,returns 一个 Cursor.This class 以标准方式实现加载器协议以查询 cursors.It 只不过是一个 AsyncTaskLoader .

简而言之,当您必须通过扩展 AsyncTaskLoader< D >(其中 D="anything_you_want_to_load")来创建自定义加载程序时,您可以使用 AsyncTaskLoader。当您必须实现加载 Cursor 的加载器时,您会使用 CursorLoader(通常在您从数据库加载数据时使用)。

CursorLoaderAsyncTaskLoader 的区别是

  • AsyncTaskLoader 可用于 return 自定义对象,但 CursorLoader return 仅 Cursor
  • CursorLoader能收到getContext().getContentResolver().notifyChange(uri, null);AsyncTaskLoader收不到。

值得注意的是CursorLoaderAsyncTaskLoader<D>的具体实现。基本上,CursorLoader可以认为是一个AsyncTaskLoader,专门用来处理Cursor个对象。