【发布时间】:2011-11-22 18:18:35
【问题描述】:
我有一个问题,我不知道如何解决它。我的应用程序中的一个活动有多个AsyncTasks,它们访问单个SQLiteOpenHelper。我在onCreate() 中初始化并打开帮助程序,并在onStop() 中关闭它。我还检查它是否已经在onResume()中初始化。
自从我发布了我的应用程序后,我在doInBackground 中收到了许多带有 Null 异常的错误,我尝试访问 DB 帮助程序。我知道这是因为数据库在调用 doInBackground 之前关闭(onStop()),这很公平。
我的问题是,我应该在哪里关闭数据库连接?在 Activity 中使用 DB 助手的单个实例并从多个线程访问它(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
}
}
}
【问题讨论】:
标签: android sqlite android-asynctask sqliteopenhelper