活动生命周期和数据库混乱

时间:2011-12-25 20:06:31

标签: android android-activity sqliteopenhelper

我有一个活动,我通过调用SQLiteOpenHelper的构造函数来打开数据库。

dbHelper = new DBHelper(this); //DBHelper class extends SQLiteOpenHelper

然后点击一个按钮,我打开另一个活动并关闭dbHelper。

int cuisineId = HelperUtils.getCuisineIdByName(dbHelper,cuisine);
SingletonGlobalClass.getInstance().setCuisineId(cuisineId);
String restaurantNameSearchStr = restaurantName.getText().toString().trim();
Intent intent = new Intent();
intent.setComponent(new ComponentName("ctnxa.android", ctnxa.android.SearchResultActivity"));
intent.putExtra("searchStr", restaurantNameSearchStr);
intent.putExtra("option", R.string.restaurant);
startActivity(intent);
dbHelper.close();

现在,当我按下后退按钮时,它会回到此活动。当我试图再次单击搜索按钮时,它使用dbHelper并且通常没有任何错误。我的期望是它不应该工作,因为之前已经关闭了dbHelper并且它只能在调用活动onCreate()方法时重新实例化,在这种情况下没有被调用,因为我只是按下后退按钮(它应该调用的onResume())。我真的很困惑。任何机构都可以解释这里发生的事情。

编辑:这就是我实现dbHelper.close()

的方法
@Override
public synchronized void close() {
    super.close();
}

2 个答案:

答案 0 :(得分:2)

当您开始新的Activity时,第一个Activity可能会或可能不会经历各种“退出”。阶段但不保证它会经历哪些阶段。它完全取决于单个设备上的可用资源和其他因素。

第一个Activity可能会暂停,当您返回时,它会恢复。但是,第一个活动很可能会被停止甚至销毁。无法保证Android操作系统将对第一个Activity做什么。

在你的情况下,当你从第二个Activity返回时,似乎第一个IS实际上被销毁并重新创建。

验证这一点的唯一方法是覆盖所有方法,例如onPauseonStoponDestroy,并让每个方法都使用Log来显示哪些阶段第一个Activity经过。

答案 1 :(得分:1)

通过确保在整个应用程序的生命周期中只存在一个SQLiteOpenHelper,可以避免很多这种混淆。查看此answer了解详情。