【发布时间】:2012-01-31 04:22:17
【问题描述】:
这件事的奇怪之处在于它不会每次都发生。我正在向数据库中添加一些东西,如果我这样做了几次,没有任何反应,但是如果我继续添加并继续添加,则会出现此错误消息。有时它会发生第二次,而其他时候直到第五次才会发生。似乎是随机的。任何人都知道为什么每次按下相同的按钮组合不会导致此错误消息?
【问题讨论】:
这件事的奇怪之处在于它不会每次都发生。我正在向数据库中添加一些东西,如果我这样做了几次,没有任何反应,但是如果我继续添加并继续添加,则会出现此错误消息。有时它会发生第二次,而其他时候直到第五次才会发生。似乎是随机的。任何人都知道为什么每次按下相同的按钮组合不会导致此错误消息?
【问题讨论】:
首先关闭 onDestroy 和 onStop 中的光标,如下所示:
if(mCursor!= null && !mCursor.isClosed())
mCursor.close();
然后尝试在使用光标对象的位置之后调用startManagingCursor(cursor),如果您使用它进行查询等,请在使用光标进行的操作之后调用它。
【讨论】:
在从 SQLite 数据库中为 ListView 获取数据时,您可能遇到了同样的问题。
如果在完成后关闭光标... ListView 为空白。
如果您不关闭光标... ListView 偶尔会产生您所看到的错误。
解决方案?使光标对您的班级具有全局性......并且只关闭一次:当您完全完成它时。 (在 onDestroy 和/或 onStop 内)。
我不确定为什么会发生 #1。 (我尽量避免使用全局变量。但在这里无法避免。)
【讨论】:
您应该在错误之前看到以下内容:
D/dalvikvm( 285): GC_FOR_MALLOC freed
这表明 android 机器正在释放潜在的泄漏以获取更多内存。您的光标也是一个泄漏,因为您没有使用 <cursor>.close() 正确关闭它;
【讨论】: