我建立与具有下面的代码的活动Android应用程序:如何解决“请确保您明确地在您的光标上调用close()”?
public class SavedSalesActivity extends Activity {
protected ListView mSalesList;
protected Cursor mSalesCursor;
protected SalesCursorAdapter mSalesAdapter;
protected SalesDbAdapter mDb;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.sales_list);
mDb = new SalesDbAdapter(this);
mDb.open();
mSalesCursor = mDb.getSaved();
startManagingCursor(mSalesCursor);
mSalesAdapter = new SalesCursorAdapter(this, R.layout.sales_list_item, mSalesCursor,
new String[0], new int[0]);
mSalesList = (ListView)findViewById(R.id.sales_listview);
mSalesList.setAdapter(mSalesAdapter);
mSalesList.setEmptyView(findViewById(android.R.id.empty));
mSalesList.setOnItemClickListener(new OnItemClickListener() {...});
}
@Override
protected void onStart() {
Log.v(TAG, "Starting SavedSalesActivity");
mDb.open();
mSalesCursor = mDb.getSaved();
startManagingCursor(mSalesCursor);
super.onStart();
}
@Override
protected void onStop() {
Log.v(TAG, "Stopping SavedSalesActivity");
mSalesCursor.close();
mDb.close();
super.onStop();
}
}
按照我的理解,这应该是绰绰有余正确关闭我所有的资源更多,但是如果我打开这个活动并退出它与Android设备后退按钮,我在短暂(可变)的一段时间后在Logcat中得到这个。
03-08 19:33:58.492: WARN/SQLiteCompiledSql(5169): Releasing statement in a finalizer. Please ensure that you explicitly call close() on your cursor: SELECT * FROM sales ORDER BY featured DESC
03-08 19:33:58.492: WARN/SQLiteCompiledSql(5169): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here
03-08 19:33:58.492: WARN/SQLiteCompiledSql(5169): at android.database.sqlite.SQLiteCompiledSql.<init>(SQLiteCompiledSql.java:62)
03-08 19:33:58.492: WARN/SQLiteCompiledSql(5169): at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:80)
03-08 19:33:58.492: WARN/SQLiteCompiledSql(5169): at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:46)
03-08 19:33:58.492: WARN/SQLiteCompiledSql(5169): at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:42)
03-08 19:33:58.492: WARN/SQLiteCompiledSql(5169): at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1345)
03-08 19:33:58.492: WARN/SQLiteCompiledSql(5169): at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1229)
03-08 19:33:58.492: WARN/SQLiteCompiledSql(5169): at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1184)
03-08 19:33:58.492: WARN/SQLiteCompiledSql(5169): at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1264)
03-08 19:33:58.492: WARN/SQLiteCompiledSql(5169): at com.maps.app.classifiedconcepts.sale.SalesDbAdapter.getSaved(SalesDbAdapter.java:149)
03-08 19:33:58.492: WARN/SQLiteCompiledSql(5169): at com.maps.app.classifiedconcepts.sale.SavedSalesActivity.onCreate(SavedSalesActivity.java:113)
03-08 19:33:58.492: WARN/SQLiteCompiledSql(5169): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
03-08 19:33:58.492: WARN/SQLiteCompiledSql(5169): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
03-08 19:33:58.492: WARN/SQLiteCompiledSql(5169): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
03-08 19:33:58.492: WARN/SQLiteCompiledSql(5169): at android.app.ActivityThread.access$2300(ActivityThread.java:125)
03-08 19:33:58.492: WARN/SQLiteCompiledSql(5169): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
03-08 19:33:58.492: WARN/SQLiteCompiledSql(5169): at android.os.Handler.dispatchMessage(Handler.java:99)
03-08 19:33:58.492: WARN/SQLiteCompiledSql(5169): at android.os.Looper.loop(Looper.java:123)
03-08 19:33:58.492: WARN/SQLiteCompiledSql(5169): at android.app.ActivityThread.main(ActivityThread.java:4627)
03-08 19:33:58.492: WARN/SQLiteCompiledSql(5169): at java.lang.reflect.Method.invokeNative(Native Method)
03-08 19:33:58.492: WARN/SQLiteCompiledSql(5169): at java.lang.reflect.Method.invoke(Method.java:521)
03-08 19:33:58.492: WARN/SQLiteCompiledSql(5169): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
03-08 19:33:58.492: WARN/SQLiteCompiledSql(5169): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
03-08 19:33:58.492: WARN/SQLiteCompiledSql(5169): at dalvik.system.NativeStart.main(Native Method)
03-08 19:33:58.503: ERROR/Database(5169): close() was never explicitly called on database '/data/data/com.maps.app.classifiedconcepts/databases/classified_concepts'
03-08 19:33:58.503: ERROR/Database(5169): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here
03-08 19:33:58.503: ERROR/Database(5169): at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1810)
03-08 19:33:58.503: ERROR/Database(5169): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:817)
03-08 19:33:58.503: ERROR/Database(5169): at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:851)
03-08 19:33:58.503: ERROR/Database(5169): at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:844)
03-08 19:33:58.503: ERROR/Database(5169): at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:540)
03-08 19:33:58.503: ERROR/Database(5169): at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203)
03-08 19:33:58.503: ERROR/Database(5169): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:112)
03-08 19:33:58.503: ERROR/Database(5169): at com.maps.app.classifiedconcepts.sale.SalesDbAdapter.open(SalesDbAdapter.java:163)
03-08 19:33:58.503: ERROR/Database(5169): at com.maps.app.classifiedconcepts.sale.SavedSalesActivity.onCreate(SavedSalesActivity.java:112)
03-08 19:33:58.503: ERROR/Database(5169): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
03-08 19:33:58.503: ERROR/Database(5169): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
03-08 19:33:58.503: ERROR/Database(5169): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
03-08 19:33:58.503: ERROR/Database(5169): at android.app.ActivityThread.access$2300(ActivityThread.java:125)
03-08 19:33:58.503: ERROR/Database(5169): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
03-08 19:33:58.503: ERROR/Database(5169): at android.os.Handler.dispatchMessage(Handler.java:99)
03-08 19:33:58.503: ERROR/Database(5169): at android.os.Looper.loop(Looper.java:123)
03-08 19:33:58.503: ERROR/Database(5169): at android.app.ActivityThread.main(ActivityThread.java:4627)
03-08 19:33:58.503: ERROR/Database(5169): at java.lang.reflect.Method.invokeNative(Native Method)
03-08 19:33:58.503: ERROR/Database(5169): at java.lang.reflect.Method.invoke(Method.java:521)
03-08 19:33:58.503: ERROR/Database(5169): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
03-08 19:33:58.503: ERROR/Database(5169): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
03-08 19:33:58.503: ERROR/Database(5169): at dalvik.system.NativeStart.main(Native Method)
线mSalesCursor = mDb.getSaved();调用我SalesDbAdapter下面的代码:
public Cursor getSaved() {
return mDb.query(TABLE_NAME, null, null, null, null, null, KEY_FEATURED + " DESC");
}
我在做什么错?为什么我会收到这些例外情况?我特别困惑,因为我认为在初始化mSalesCursor后立即调用startManagingCursor(mSalesCursor)可以节省我在任何Activity生命周期方法中关闭Cursor的需求。
为什么你获得两个游标?一个在onCreate和另一个在onStart?什么是这两个行号:com.maps.app.classifiedconcepts.sale.SalesDbAdapter.getSaved(SalesDbAdapter.java:149) com.maps.app.classifiedconcepts.sale.SavedSalesActivity.onCreate(SavedSalesActivity.java:113) – bhups 2011-03-09 04:05:54
我原来的代码没有在onStart()中获得游标,但我添加了它,因为在排除故障时,我添加了mSalesCursor.close();到onStop()。 – rushinge 2011-03-09 04:11:45
编辑原帖显示SalesDbAdapter.java:149和SavedSalesActivity.java:113 – rushinge 2011-03-09 04:28:23