У меня проблема, и я не знаю, как ее решить. Действие в моем приложении имеет несколько 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
}
}
}