【问题标题】:Android effectively cursor usage?Android有效地使用光标?
【发布时间】:2013-01-20 17:57:11
【问题描述】:
在我的 Android 活动中,我多次使用 rawquery。我为那个 rawquery 使用了一个静态游标。我的问题是:我应该在执行另一个 rawquery 之前关闭我的光标还是让它保持打开状态直到所有 rawqueries 都被执行(只关闭一次)。
我都尝试了,结果是一样的。但就性能/调试而言,哪个更好?
【问题讨论】:
-
"但就性能而言,哪个更好?"如果您使用DDMS 之类的工具,您可以自己轻松回答这个问题。
标签:
android
cursor
android-sqlite
【解决方案1】:
您应该在完成后关闭光标。否则你将消耗你的应用程序所有允许的游标资源(它是有限的)并且会得到一个异常。
制作静态并不会使其成为所有人的开放游标。请记住,它在 java 端是静态的;这里有一个本地端,它为每个打开的游标使用新资源。你需要释放这些资源。
【解决方案2】:
如果您在每次使用后不关闭光标,那么您的内存泄漏非常严重。您实际上在做的是为每个查询创建一个新游标,但使用单个静态引用仅引用最新的。 (对旧游标的引用丢失。)
如果(例如)运行时尝试进行一些垃圾收集,未关闭的游标也可能导致致命错误。如果 SQLiteDatabase 的 finalize() 方法(在垃圾回收中调用)发现某些游标仍处于打开状态,则会引发异常,这可能会导致您的应用程序崩溃。