我应该使用AsyncTaskLoader,还是CursorLoader?它们各有什么优缺点?何时应该选择哪一个?在官方page中,App-listing示例使用的是AsyncTaskLoader而不是CursorLoader。我在某个地方读到过关于CursorLoader不处理内容更改(在sqlite中)的问题。谢谢!
AsyncTaskLoader是一个抽象的Loader,它提供了一个AsyncTask来执行工作。因此,您通常会扩展AsyncTaskLoader以创建自己的自定义加载器。使用AsyncTask和使用AsyncTaskLoader之间的关键区别在于,配置更改(例如方向更改)不会影响AsyncTaskLoader及其进程,因为AsyncTaskLoader具有自己的生命周期;而配置更改会对AsyncTask产生负面影响,因为它连接到主活动的生命周期。
CursorLoader是一个加载器,它查询ContentResolver并返回Cursor。这个类以标准方式实现了查询游标的Loader协议。它就是一个AsyncTaskLoader。
简而言之,当您必须通过扩展AsyncTaskLoader<D>来创建自定义加载器时,可以使用AsyncTaskLoader,其中D =“anything_you_want_to_load”。当您必须实现一个加载器来加载游标(通常用于从数据库加载数据)时,您会使用CursorLoader。
需要注意的一点是,CursorLoader
是 AsyncTaskLoader<D>
的具体实现。基本上,CursorLoader
可以被认为是专门处理 Cursor
对象的 AsyncTaskLoader
。
CursorLoader
和AsyncTaskLoader
的区别在于:
AsyncTaskLoader
可用于返回自定义对象,但CursorLoader
仅返回游标。CursorLoader
可以接收getContext().getContentResolver().notifyChange(uri, null);
,但AsyncTaskLoader
不接收。