私は問題があり、どのように接近するのか分かりません。私のアプリのアクティビティには、複数のAsyncTask
があり、それらは単一のSQLiteOpenHelper
にアクセスします。私はonCreate()
でヘルパーを初期化して開き、onStop()
で閉じています。また、onResume()
で初期化されているかどうかを確認します。Android AsyncTaskとSQLite DBインスタンス
私は自分のアプリを公開して以来、私はDBヘルパーにアクセスしようとするdoInBackground
のヌル例外でエラーの数を受け取りました。私はこれが起こっていることを知っているのは、doInBackground
が呼び出される直前にDBがクローズ(onStop()
)されているからです。
私の質問は、どこでDB接続を閉じるべきですか?アクティビティでDBヘルパの単一インスタンスを使用し、複数のスレッド(AsyncTasks
)からアクセスするのは正しいですか?または、それぞれAsyncTask
に対して別々のDBヘルパーインスタンスを使用する必要がありますか?
これが私の活動の単純化されたスケルトンです:単一のDB Helper
を使用するのは良いです
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
}
}
}
基本的にdoInBackgroundでwhile(!isCancelled){}を使用し、ループ内ですべての計算を実行する必要がありますか? – Marqs
はい、主スレッドでgetStatus()をチェックして、AsyncTaskが終了したことを確認してください。 –
OKですが、onStop()でチェックしても終了していない場合はどうなりますか?どこでDB接続を終了しますか? – Marqs