Ho un problema e non sono sicuro di come affrontarlo. Un'attività nella mia app ha più AsyncTask
s che accedono al singolo SQLiteOpenHelper
. Inizializzo e apro l'helper in onCreate()
e lo chiudo in onStop()
. Controllo anche se è stato inizializzato in onResume()
.Istanza Android AsyncTask e SQLite DB
Da quando ho pubblicato la mia app ho ricevuto il numero di errori con Null Exception in doInBackground
dove cerco di accedere all'helper DB. So che questo succede perché il DB è chiuso (onStop()
) poco prima che venga chiamato il numero doInBackground
, abbastanza equo.
La mia domanda è, dove devo chiudere la connessione DB? È corretto utilizzare una singola istanza dell'helper DB nell'attività e accedervi da più thread (AsyncTasks
)? O dovrei usare un'istanza helper DB separata per ogni AsyncTask
?
Si tratta di uno scheletro semplificata della mia attività:
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
}
}
}
Quindi in pratica dovrei usare mentre (! IsCancelled) {} in doInBackground ed eseguire tutti i calcoli all'interno del ciclo? – Marqs
Sì, e controlla getStatus() nel thread principale per essere sicuro che il AsyncTask sia terminato. –
OK ma cosa succede se lo controllo in onStop() e non è finito? Dove dovrei chiudere la connessione DB allora? – Marqs