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

时间:2012-06-19 01:49:50

标签: android android-contentprovider android-cursoradapter android-loadermanager android-cursorloader

Google文档指出不要使用CursorAdapters第一个构造函数

CursorAdapter(Context context, Cursor c)

只有两个其他选项,

CursorAdapter(Context context, Cursor c, boolean autoRequery)

  

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

CursorAdapter(Context context, Cursor c, int flags)`

表示它是推荐的构造函数。

问题是这里只有两个标志用于最后一个构造函数,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发生冲突吗?目标是不会导致任何内存泄漏并保持高效。

1 个答案:

答案 0 :(得分:19)

几周前,我在博客上发表了关于这个主题的文章...也许阅读它会有所帮助。您也可以考虑阅读开发人员网站上的sample code

Reaping the Benefits of the LoaderManager Class


  

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

使用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 it FLAG_AUTO_REQUERY`,因为那样flag已弃用。

  

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

LoaderManager的重点在于它在幕后为您完成所有烦人的光标管理工作。在不必担心管理查询光标的情况下自动加载数据的便利性正是旧的startManagingCursorstopManagingCursor方法被弃用的原因。

  

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

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