CursorLoader和AsyncTaskLoader之间的区别

时间:2015-02-25 03:32:31

标签: android android-asynctask android-sqlite android-cursorloader

为什么我应该使用 AsyncTaskLoader ,何时我更喜欢 CursorLoader ,反之亦然?

在官方page中,显示了App-listing示例,它使用AsyncTaskLoader而不是CursorLoader。

这两者的优点和缺点是什么?我在某处读到了CursorLoader没有关注内容更改(在sqlite中)。

谢谢!

4 个答案:

答案 0 :(得分:23)

AsyncTaskLoader是一个抽象的Loader,它提供了一个AsyncTask来完成工作。所以你通常会扩展AsyncTaskLoader以创建你自己的自定义加载器。使用AsyncTask和使用AsyncTaskloader之间的关键区别在于配置更改(例如方向)更改)不影响AsyncTaskLoader及其进程,因为AsyncTaskLoader有自己的生命周期;而配置更改会影响AsyncTask,因为它连接到主机活动的生命周期。

CursorLoader是一个查询ContentResolver并返回Cursor的加载器。该类以标准方式实现Loader协议,用于查询游标。它只是一个AsyncTaskLoader。

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

答案 1 :(得分:4)

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

答案 2 :(得分:1)

AsyncTaskLoader是Loaders的一个特殊子类。这个类执行与AsyncTask相同的功能,但更好一点。 但是,使用AsyncTasks存在一些问题:

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

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

Loader的优点在于它处理了使用AsyncTask时通常会遗漏的一些“陷阱”。主要是,它处理活动配置更改(用户旋转屏幕时的IE)。

另一方面,当在Android中使用游标来提取数据时,CursorLoader确实闪耀。每当基础数据发生变化时,Loader类都可以很好地更新Cursor信息(以及UI)。当信息经常更改并且您不想中断UI以及用户当前正在执行的操作时,这非常有用,只是为了显示一些新信息。

答案 3 :(得分:1)

CursorLoaderAsyncTaskLoader的差异是

  • AsyncTaskLoader可用于返回自定义对象,但CursorLoader仅返回Cursor
  • CursorLoader可以收到getContext().getContentResolver().notifyChange(uri, null);,但AsyncTaskLoader无法收到。