【问题标题】:Difference between CursorLoader and AsyncTaskLoaderCursorLoader 和 AsyncTaskLoader 的区别
【发布时间】:2015-02-25 03:32:30
【问题描述】:
我为什么要使用 AsyncTaskLoader,什么时候应该使用 CursorLoader,反之亦然?
在官方page中,显示了App-listing示例,它使用AsyncTaskLoader而不是CursorLoader。
这两者的优缺点是什么?我在某处读到了关于 CursorLoader 不关心内容更改(在 sqlite 中)。
谢谢!
【问题讨论】:
标签:
android
android-asynctask
android-sqlite
android-cursorloader
【解决方案1】:
AsyncTaskLoader 是一个抽象的 Loader,它提供了一个 AsyncTask 来完成工作。因此,您通常扩展 AsyncTaskLoader 以创建自己的自定义加载器。使用 AsyncTask 和使用 AsyncTaskloader 的主要区别在于配置更改(例如方向change) 不会影响 AsyncTaskLoader 及其进程,因为 AsyncTaskLoader 有自己的生命周期;而配置更改会对 AsyncTask 产生不利影响,因为它连接到主机 Activity 的生命周期。
CursorLoader 是一个查询 ContentResolver 并返回一个 Cursor 的加载器。该类以标准方式实现了 Loader 协议,用于查询游标。它只不过是一个 AsyncTaskLoader。
简而言之,当您必须通过扩展 AsyncTaskLoader where D="anything_you_want_to_load" 来创建自定义加载器时,您可以使用 AsyncTaskLoader。当你必须实现一个加载 Cursor 的加载器时使用 CursorLoader(通常在你从数据库加载数据时使用)。
【解决方案2】:
值得注意的是CursorLoader 是AsyncTaskLoader<D> 的具体实现。基本上,CursorLoader 可以被认为是一个专门用来处理Cursor 对象的AsyncTaskLoader。
【解决方案3】:
AsyncTaskLoader 是 Loaders 的一个特殊子类,值得关注。此类执行与 AsyncTask 相同的功能,但要好一些。
但是,使用 AsyncTasks 存在一些问题:
配置更改可能会搞砸
暂停活动不会暂停 AsyncTask
相当多的样板代码(这意味着更多可能的错误)
它可以更轻松地处理 Activity 配置更改,并且它在 Fragment 和 Activity 的生命周期内运行。好处是 AsyncTaskLoader 可以在使用 AsyncTask 的任何情况下使用。每当需要将数据加载到内存中以供 Activity/Fragment 处理时,AsyncTaskLoader 都可以更好地完成工作。
Loader 的美妙之处在于它处理了一些在使用 AsyncTask 时通常会遗漏的“陷阱”。主要是处理activity配置的变化(用户旋转屏幕时的IE)。
另一方面,CursorLoader 在使用 Android 中的 Cursors 拉取数据时真的很出色。每当底层数据发生变化时,Loader 类在更新游标信息(进而更新 UI)方面做得非常出色。当信息经常更改并且您不想中断 UI 并且无论用户当前正在做什么只是为了显示一些新信息时,这将非常有用。
【解决方案4】:
CursorLoader 和 AsyncTaskLoader 的区别是
-
AsyncTaskLoader 可用于返回自定义对象,但 CursorLoader 仅返回光标
-
CursorLoader 可以接收getContext().getContentResolver().notifyChange(uri, null); 但AsyncTaskLoader 不接收。