1

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();
}
4

2 に答える 2

2

新しいを開始するときActivity、最初Activityの段階はさまざまな「終了」段階を通過する場合と通過しない場合がありますが、どの段階を通過するかは保証されません。これは、個々のデバイスで利用可能なリソースやその他の要因に完全に依存します。

最初のものActivityは単に一時停止するかもしれません、そしてあなたが戻るときそれは再開します。ただし、最初のアクティビティは停止されるか、破壊される可能性が非常に高くなります。AndroidOSが最初のもので何をするかについての保証はありませんActivity

あなたの場合、最初のISは実際に破壊され、2番目のISから戻ったときに再作成されているようですActivity

これを確認する唯一の方法は、などのすべてのメソッドをオーバーライドし、onPauseonStopメソッドonDestroyを使用Logして、最初のステージがどのステージActivityを通過するかを示すことです。

于 2011-12-25T20:38:14.170 に答える
1

アプリケーションのライフサイクル全体でSQLiteOpenHelperが1つだけ存在するようにすることで、この混乱の多くを回避できます。詳細については、この回答を確認してください。

于 2012-01-17T03:38:30.853 に答える