如何设置CursorAdapter(Context context,Cursor c,int flags)以使其与CursorLoader一起使用?

And*_*ndy 13 android android-contentprovider android-loadermanager android-cursorloader android-cursoradapter

谷歌文档指出不使用第CursorAdapters一个构造函数,

CursorAdapter(Context context, Cursor c)
Run Code Online (Sandbox Code Playgroud)

只有两个选项,

CursorAdapter(Context context, Cursor c, boolean autoRequery)
Run Code Online (Sandbox Code Playgroud)

这说

允许控制自动重新查询的构造函数.建议您不要使用它,而是使用CursorAdapter(Context,Cursor,int).使用此构造函数时,将始终设置FLAG_REGISTER_CONTENT_OBSERVER

CursorAdapter(Context context, Cursor c, int flags)`
Run Code Online (Sandbox Code Playgroud)

这说它是推荐的构造函数.

问题是这里只有两个标志用于最后一个构造函数,FLAG_AUTO_REQUERY(int 1)和FLAG_REGISTER_CONTENT_OBSERVER(int 2).使用FLAG_AUTO_REQUERY没有意义,因为我现在使用CursorLoader在后台管理它并更新它.有FLAG_REGISTER_CONTENT_OBSERVER,它表示使用时不需要CursorLoader.

现在我问,我通过什么整数CursorAdapter(Context context, Cursor c, int flags)才能使它与我的工作正常CursorAdapter?让我担心的是如何正确管理旧光标.我不确定这样做的正确方法.

如果我使用FLAG_REGISTER_CONTENT_OBSERVER,那么我必须做一些事情onContentChanged(),但swapCursor()在我使用时LoaderManager,由于光标未关闭,我可以做adapter.swapCursor(cursor).close().但会与冲突onContentChanged()CursorAdapter?目标是不会导致任何内存泄漏并且效率很高.

Ale*_*ood 19

几个星期前我在这个主题上发表了博客...也许阅读它会有所帮助.您还可以考虑阅读开发人员站点上的示例代码.

获得LoaderManager类的好处


我应该使用哪种构造函数?

使用CursorAdapter(Context context, Cursor c, int flags)(文档建议在前者上使用此构造函数).

我通过什么整数CursorAdapter(Context context, Cursor c, int flags).

只需将整数传递给它0.你并不想通过它FLAG_REGISTER_CONTENT_OBSERVER,因为你使用的是CursorLoader与你的CursorAdapter(因为CursorLoader寄存器ContentObserver for you), and you definitely don't want to pass itFLAG_AUTO_REQUERY`由于该标志已被弃用.

令我担心的是如何正确管理旧光标.我不确定这样做的正确方法.

整个问题LoaderManager是它在幕后为你做了所有烦人的光标管理工作.自动加载数据的便利性,而不必担心管理查询的游标,正是旧的startManagingCursorstopManagingCursor方法被弃用的原因.

......我可以做到 adapter.swapCursor(cursor).close()

不要那样做.在LoaderManager将关闭自身的光标.事实上,如果我没记错的话,如果你试图调用close()光标,就会出错.听起来你不应该重写onContentChanged().

  • 它应该在API中定义为CursorAdapter.FLAG_NONE = 0 ...谢谢@AlexLockwood (2认同)