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
发生冲突吗?目标是不会导致任何内存泄漏并保持高效。
答案 0 :(得分:19)
我应该使用哪种构造函数?
使用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
的重点在于它在幕后为您完成所有烦人的光标管理工作。在不必担心管理查询光标的情况下自动加载数据的便利性正是旧的startManagingCursor
和stopManagingCursor
方法被弃用的原因。
......我可以做
adapter.swapCursor(cursor).close()
不要那样做。 LoaderManager
将自己关闭光标。事实上,如果我没记错的话,如果你试图在光标上调用close()
,就会出错。听起来你不应该重写onContentChanged()
。