Android AsyncTask и экземпляр SQLite DB

У меня проблема, и я не знаю, как ее решить. Действие в моем приложении имеет несколько AsyncTask , которые обращаются к одному SQLiteOpenHelper . Я инициализирую и открываю помощник в onCreate () и закрываю его в onStop () . Я также проверяю, было ли оно инициализировано в onResume () .

С тех пор, как я опубликовал свое приложение, я получил ряд ошибок с нулевым исключением в doInBackground , где я пытаюсь получить доступ к помощнику БД.Я знаю, что это происходит потому, что БД закрывается ( onStop () ) непосредственно перед вызовом doInBackground , достаточно справедливо.

У меня вопрос, где мне закрыть соединение с БД? Правильно ли использовать один экземпляр помощника БД в Activity и обращаться к нему из нескольких потоков ( AsyncTasks )? Или мне следует использовать отдельный экземпляр помощника БД для каждой 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
        }
    }
}
8
задан Jeff Axelrod 6 August 2012 в 15:56
поделиться