我有一个问题,不确定如何解决。我的app中有多个
AsyncTask
访问同一个SQLiteOpenHelper
。我在onCreate()
中初始化并打开帮助器,在onStop()
中关闭它。我还会在onResume()
中检查是否已初始化。
自从我发布了我的应用程序后,我收到了许多在doInBackground
中出现Null Exception的错误报告,这是因为在调用doInBackground
之前关闭了DB(onStop()
),很公平。
我的问题是,我应该在哪里关闭DB连接?在Activity中使用单个DB helper实例并从多个线程(AsyncTasks
)访问它是正确的吗?还是每个AsyncTask
都应该使用单独的DB helper实例?
以下是我的Activity的简化框架:
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
}
}
}