13

谷歌文档指出不要使用第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()in冲突CursorAdapter吗?目标是不引起任何内存泄漏并提高效率。

4

1 回答 1

19

几周前我在博客上写过这个话题……也许通读它会有所帮助。您还可以考虑通读开发人员网站上的示例代码。

获得 LoaderManager 类的好处


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

使用CursorAdapter(Context context, Cursor c, int flags)(文档建议使用此构造函数而不是前者)。

我传递什么整数CursorAdapter(Context context, Cursor c, int flags)

只需将整数传递给它0。您不想传递它FLAG_REGISTER_CONTENT_OBSERVER,因为您正在使用 aCursorLoader与您的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()

于 2012-06-19T03:16:31.253 回答