私には問題があり、それにどのようにアプローチすればよいかわかりません。私のアプリのアクティビティには、AsyncTask
単一の にアクセスする複数の がありますSQLiteOpenHelper
。でヘルパーを初期化して開き、でonCreate()
閉じていonStop()
ます。で初期化されているかどうかも確認しonResume()
ます。
アプリを公開してdoInBackground
から、DB ヘルパーにアクセスしようとしたところ、Null Exception で多数のエラーを受け取りました。が呼び出されるonStop()
直前にDB が閉じられている () ため、これが発生することはわかっています。doInBackground
私の質問は、どこで DB 接続を閉じる必要があるかということです。アクティビティで DB ヘルパーの 1 つのインスタンスを使用し、複数のスレッドからアクセスすることは正しいAsyncTasks
ですか? ( ) または、それぞれに個別の DB ヘルパー インスタンスを使用する必要がありますAsyncTask
か?
これは私の活動の単純化されたスケルトンです:
public class MyActivity extends Activity{
private DbHelper mDbHelper;
private ArrayList<ExampleObject> objects;
@Override
public void onStop(){
super.onStop();
if(mDbHelper != null){
mDbHelper.close();
mDbHelper = null;
}
}
@Override
public void onResume(){
super.onResume();
if(mDbHelper == null){
mDbHelper = new DbHelper(this);
mDbHelper.open();
}
}
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
DbHelper mDbHelper = new DbHelper(this);
mDbHelper.open();
}
private class DoSomething extends AsyncTask<String, Void, Void> {
@Override
protected Void doInBackground(String... arg0) {
objects = mDbHelper.getMyExampleObjects();
return null;
}
@Override
protected void onPostExecute(final Void unused){
//update UI with my objects
}
}
private class DoSomethingElse extends AsyncTask<String, Void, Void> {
@Override
protected Void doInBackground(String... arg0) {
objects = mDbHelper.getSortedObjects();
return null;
}
@Override
protected void onPostExecute(final Void unused){
//update UI with my objects
}
}
}