编辑:更新答案以反映更新的问题 1:
1) 每次调用 fetchTodo 时都会创建一个新游标
然后回来了。将前一个光标留给垃圾收集器。
所以,如果我不使用 startManagingCursor 甚至 CursorLoader
没关系,当我完成后我应该在光标上调用 .close()
它 ?
是的,你绝对应该告诉 AndroidstartManagingCursor()
, use LoaderManager
/CursorLoader
or close()
你自己吧。不这样做会泄漏内存,GC 对此无济于事,因为背后有本机资源Cursor
(例如数据库的文件句柄)。
2) Cursor 还有一个 .deactive() 方法,文档中有说明
使用更少的资源(比活动游标)。我到底应该什么时候使用
这? ...
EDIT致其他读者:OP找到了答案并将其发布在他的问题中。以下内容仍然成立:
我从来没有用过deactivate()(没有deactive()
),也许其他人可以解释这一点。如果您想要真正轻松的重新查询/更新,请查看LoaderManager
框架——它不仅仅适用于 Honeycomb:使用您可以使用的 compat 库LoaderManager
(and Fragments
)降至 Android 1.6。它不仅减少了您需要编写的代码,而且将这些事情完全卸载到 Android,比startManagingCursor()
.
EDIT2:一些注释LoaderManager
有LoaderManager
developer.android.com 上的教程,但这些教程非常...复杂且难以理解,就像那里的大多数教程一样。我还必须挖掘很多,迄今为止我发现的最好的一站式服务是http://mobile.tutsplus.com/tutorials/android/android-sdk_loading-data_cursorloader/(加上您可以找到的所有 javadocs 和 compat lib 源代码)---方式LoaderManager
作品与(现在也已弃用,替换为DialogFragment
)管理对话与他们onCreateDialog
, onPrepareDialog
您只需告诉 Android“显示对话框 #123”,然后 Android 使用该 ID 调用您的代码的方法;加载器也一样:“load loader #123”,Android 调用onCreateLoader()
.
唯一明显的缺点是最初LoaderManager
很大程度上依赖于ContentProvider
框架,有些人似乎真的不喜欢它。当然,这是额外的学习和代码,但是一旦你有了ContentProvider
对于您自己的数据(即使仅在您的应用程序中私下使用),所有数据到视图的绑定都是轻而易举的CursorLoader
。恕我直言,滚动你自己的“内容提供商”和实际实现之间没有什么区别ContentProvider
——但这只是我极具争议性的观点:)
3)我知道 startManagingCursor/stopManagingCursor 已被弃用
但我的目标不是 Honeycomb(至少暂时如此)并且我
现在不想处理新的 CursorLoader。但在
上面的教程中,startManagingCursor 到处都用到了,但是
stopManagingCursor 永远不会被调用一次。为什么不?安卓有优惠吗
以它自己的方式?任何情况我应该打电话
停止管理光标?
一旦你打电话startManagingCursor()
the Cursor
不再是你的问题。 Android 将在您关闭光标时负责关闭光标Activity
被破坏(用户导航离开,方向改变,...)。无需匹配调用startManagingCursor()
打电话给stopManagingCursor()
——你通常不想承担管理一个Cursor
一旦你摆脱它,再一次。