关于我的主要活动:
button = (Button) findViewById(R.id.mainAddWatchButton);
button.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
startActivity(new Intent(audiovideo, CountyBrowser.class));
}
});
CountyBrowser活动开始很好(行为也很好,就像它应该做的那样),但在LogCat中会出现以下内容:
10-11 19:10:41.182: INFO/ActivityManager(58): Starting activity: Intent { cmp=se.ribit.bb/.CountyBrowser }
10-11 19:10:41.782: DEBUG/dalvikvm(368): GC freed 6313 objects / 354184 bytes in 114ms
10-11 19:10:41.812: INFO/dalvikvm(368): Uncaught exception thrown by finalizer (will be discarded):
10-11 19:10:41.812: INFO/dalvikvm(368): Ljava/lang/IllegalStateException;: Finalizing cursor android.database.sqlite.SQLiteCursor@43d3ec38 on null that has not been deactivated or closed
10-11 19:10:41.823: INFO/dalvikvm(368): at android.database.sqlite.SQLiteCursor.finalize(SQLiteCursor.java:596)
10-11 19:10:41.823: INFO/dalvikvm(368): at dalvik.system.NativeStart.run(Native Method)
10-11 19:10:41.852: INFO/dalvikvm(368): Uncaught exception thrown by finalizer (will be discarded):
10-11 19:10:41.862: INFO/dalvikvm(368): Ljava/lang/IllegalStateException;: **Finalizing cursor android.database.sqlite.SQLiteCursor@43d3dc80 on null that has not been deactivated or closed**
10-11 19:10:41.862: INFO/dalvikvm(368): at android.database.sqlite.SQLiteCursor.finalize(SQLiteCursor.java:596)
10-11 19:10:41.873: INFO/dalvikvm(368): at dalvik.system.NativeStart.run(Native Method)
10-11 19:10:42.452: INFO/ActivityManager(58): Displayed activity se.ribit.bb/.CountyBrowser: 1198 ms (total 1198 ms)
10-11 19:10:47.702: DEBUG/dalvikvm(206): GC freed 124 objects / 5424 bytes in 154ms
10-11 19:10:52.692: DEBUG/dalvikvm(105): GC freed 2292 objects / 133288 bytes in 107ms
我使用的是数据库和游标,但上面的消息包含的信息为零,无论我是否做错了什么。除了这些日志之外,活动运行正常。如果我在调试模式下运行所有东西,仿真器会一直将我抛回Eclipse。
我是不是漏掉了什么?有人想猜猜我做错了什么吗?
发布于 2011-10-12 03:24:15
我认为您必须在活动暂停之前关闭光标。在打开新活动的活动的onPause方法中,尝试关闭光标。
void onPause(){
myCursor1.close();
myCursor2.close();
}
发布于 2011-10-13 07:02:01
经过大量的单步调试,我找到了错误的根源。我有这样的方法:
private boolean doesColumnExist(String table, int id) {
SQLiteDatabase db = this.dbHelper.getReadableDatabase();
String query = String.format("SELECT count(*) FROM %s WHERE %s = %s",
table, C_ID, id);
Cursor c = db.rawQuery(query, null);
c.moveToFirst();
return (c.getInt(0) == 1);
}
我还不太擅长Java,所以我天真地认为当这个方法返回时,游标应该自动死亡,但我显然对这个事实大错特错了。我不得不将该方法重写为:
private boolean doesColumnExist(String table, int id) {
SQLiteDatabase db = this.dbHelper.getReadableDatabase();
String query = String.format("SELECT count(*) FROM %s WHERE %s = %s",
table, C_ID, id);
Cursor c = db.rawQuery(query, null);
c.moveToFirst();
boolean retVal = (c.getInt(0) == 1);
c.close();
return retVal;
}
现在,所有的LogCat填充物都消失了。
我从来没有意识到我必须手动执行c.close()。由于我是Java的新手,我认为Java的GC可以处理它。进一步阅读我的Java书证明我错了,大错特错。
https://stackoverflow.com/questions/7731267
复制相似问题