我有一個問題,我不知道如何處理它。我的應用中的一項活動有多個AsyncTask
,它們訪問單個SQLiteOpenHelper
。我初始化並在onCreate()
中打開助手,然後我在onStop()
中關閉它。我還檢查它是否已在onResume()
中初始化。Android AsyncTask和SQLite數據庫實例
由於我已經發布了我的應用程序,我收到了一些空錯誤,並在doInBackground
中嘗試訪問DB幫助程序。我知道這是因爲數據庫在調用doInBackground
之前關閉(onStop()
),這是公平的。
我的問題是,我應該在哪裏關閉數據庫連接?在活動中使用DB助手的單個實例並從多個線程訪問它是正確的(AsyncTasks
)?或者我應該爲每個AsyncTask
使用單獨的DB幫助程序實例?
這是我的活動的簡化骨架:
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已結束。 –
好的,但如果我在onStop()中檢查它並沒有結束?那麼我會在哪裏關閉數據庫連接呢? – Marqs