2012-08-09 74 views
15

我有一些关于Cursor的问题。android没有关闭游标的缺点

我想知道是不是关闭Cursor的缺点是什么?

它重新分配资源,但释放什么资源?

如果我们不关闭Cursor?会有什么后果和在多大程度上?

未关闭Cursor稍微不影响Activity,但它在log cat中给出错误。

回答

-2

如果不关闭游标,那么你将有访问您的数据的问题在你的数据库,因为在数据库是开放的,它不应该访问的东西发生这样的活动被暂停或以其他方式。具体来说,如果您让活动管理它,则可以缓解此问题。

+0

我havnt关闭了我的代码中的游标,它正在正确显示数据,我正在访问数据和应用程序运行正常, 它只是在logcat中发生错误完成游标尚未停用或关闭 – Haris 2012-08-09 21:32:20

+0

是您的控制游标含义的活动是否使用了manageCursor(X)? – JoxTraex 2012-08-09 22:22:13

+0

不,它工作时没有管理游标 – Haris 2012-08-10 07:11:33

7

关闭Cursor将避免任何潜在的内存泄漏,所以它们在不再使用时应始终关闭。

+0

isnt java本身处理所有内存问题?在这种情况下有什么特殊资源?我知道它应该接近,我只是想知道为什么? – Haris 2012-08-09 21:40:08

+0

'Cursor'具有本机资源,如文件句柄(请记住,SQLite数据库使用索引文件)。另外,作为一个附注,'游标'应该在'finally'块中关闭以确保它们关闭。 – 2012-08-09 22:50:09

+1

哪些原生资源?以及它们如何有害?或不会造成极度的伤害? – Haris 2012-08-10 07:15:55

3

光标只是一个接口。这在很大程度上取决于执行情况,有什么具体的类,它实现您所使用的接口...

在SQLiteCursor的情况下,有相当多的事情让清理后(这是从升级Froyo):

@Override 
public void close() { 
    super.close(); 
    deactivateCommon(); 
    mQuery.close(); 
    mDriver.cursorClosed(); 
} 

不关闭你的光标,数据仍然应该是一致的,但你会泄漏内存...

3

我不认为你会看到从忘记关闭一个游标的许多问题。这个问题(这几乎适用于任何内存泄漏)是,如果你一遍又一遍地做,最终会发生一些不好的事情。

例如,我写了一个应用程序从设备的的SQLite数据库是数据上传到服务器。如果我每次完成从数据库读取和写入的操作都没有关闭游标,最终会遇到内存不足错误和其他各种问题。