【发布时间】:2009-12-28 17:47:55
【问题描述】:
我有一个带有 ListActivity 的应用程序,它使用 CursorAdapter 作为其适配器。 ListActivity 打开数据库并查询 CursorAdapter,这一切都很好,但我在确定何时关闭 Cursor 和 SQLiteDatabase 时遇到问题。
现在处理事情的方式,如果用户完成活动,我关闭数据库和光标。但是,这仍然会导致 DalvikVM 警告我我已经打开了一个数据库 - 例如,如果用户点击“主页”按钮(将活动留在任务堆栈中),而不是“返回”按钮。
如果我在暂停期间关闭它们,然后在恢复期间重新查询,那么我不会收到任何错误,但是如果没有重新查询,用户将无法返回到列表(从而失去用户在列表中的位置)。我的意思是,用户可以单击列表中的任何项目并基于它打开一个新的活动,但通常会希望在之后点击“返回”并返回到列表中的同一位置。如果我重新查询,那么我无法将用户返回到正确的位置。
处理此问题的正确方法是什么?我希望列表保持正确滚动,但我不希望 VM 一直抱怨未关闭的数据库。
编辑:以下是我目前如何处理代码的大致轮廓:
public class MyListActivity extends ListActivity {
private Cursor mCursor;
private CursorAdapter mAdapter;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mAdapter = new MyCursorAdapter(this);
setListAdapter(mAdapter);
}
protected void onPause() {
super.onPause();
if (isFinishing()) {
mCursor.close();
}
}
protected void onDestroy() {
super.onDestroy();
mCursor.close();
}
private void updateQuery() {
// If we had a cursor open before, close it.
if (mCursor != null) {
mCursor.close();
}
MyDbHelper dbHelper = new MyDbHelper(this);
SQLiteDatabase db = dbHelper.getReadableDatabase();
mCursor = db.query(...);
mAdapter.changeCursor(mCursor);
db.close();
}
}
updateQuery() 可以被多次调用,因为用户可以通过菜单项过滤结果(我在代码中省略了这部分,因为即使用户不进行过滤,问题仍然存在)。
同样,问题是当我回家时出现泄漏错误。然而,回家后,我可以回到应用程序并再次找到我的列表 - 光标完好无损。
【问题讨论】:
-
"现在的处理方式,如果用户完成活动,我关闭数据库和光标。"你可以再详细一点吗?您在哪个 Android 事件上实现此代码(例如 onDestroy())?
-
目前在 onPause() 中。如果 isFinishing() 为真,我只调用 close()。