私には問題があり、それにどのようにアプローチすればよいかわかりません。私のアプリのアクティビティには、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
}
}
}