【发布时间】:2012-08-07 04:40:19
【问题描述】:
我有一些关于Cursor的问题。
我想知道不关闭Cursor 的缺点是什么?
它释放资源,但释放了哪些资源?
如果我们不关闭Cursor?后果是什么,程度如何?
不关闭Cursor 不会对Activity 产生一点影响,但它会在日志猫中产生错误。
【问题讨论】:
标签: java android sqlite android-cursor
我有一些关于Cursor的问题。
我想知道不关闭Cursor 的缺点是什么?
它释放资源,但释放了哪些资源?
如果我们不关闭Cursor?后果是什么,程度如何?
不关闭Cursor 不会对Activity 产生一点影响,但它会在日志猫中产生错误。
【问题讨论】:
标签: java android sqlite android-cursor
关闭Cursor 将避免任何潜在的内存泄漏,因此YES它们在不再使用时应始终关闭。
【讨论】:
Cursor 背后有本地资源,例如文件句柄(请记住,SQLite 数据库使用索引文件)。另外,作为旁注,Cursors 应该在 finally 块中关闭,以确保它们被关闭。
我认为您不会因为忘记关闭一个光标而遇到很多问题。问题(这几乎适用于任何内存泄漏)是,如果你一遍又一遍地这样做,最终会发生一些不好的事情。
例如,我编写了一个将数据从设备的 SQLite DB 上传到服务器的应用程序。如果我每次从数据库读取和写入完成时都没有关闭游标,最终我会遇到内存不足错误和其他各种问题。
【讨论】:
光标只是一个界面。很大程度上取决于实现,您使用的实现该接口的特定类...
就 SQLiteCursor 而言,有很多东西需要清理(来自 Froyo):
@Override
public void close() {
super.close();
deactivateCommon();
mQuery.close();
mDriver.cursorClosed();
}
不关闭你的Cursor,数据应该还是一致的,但是你会泄露内存...
【讨论】:
如果您不关闭游标,那么您将无法访问数据库中的数据,因为当数据库打开时,如果发生 Activity 暂停或其他情况,则无法访问它。具体来说,如果让 Activity 来管理,这个问题就可以得到缓解。
【讨论】: