Tengo un problema y no estoy seguro de cómo abordarlo. Una actividad en mi aplicación tiene múltiples AsyncTask
que tienen acceso al número SQLiteOpenHelper
. Inicializo y abrí el ayudante en onCreate()
y lo estoy cerrando en onStop()
. También compruebo si se ha inicializado en onResume()
.Android AsyncTask y SQLite DB instancia
Desde que publiqué mi aplicación, recibí varios errores con la excepción de nulo en doInBackground
donde trato de acceder al asistente de DB. Sé que esto sucede porque el DB está cerrado (onStop()
) justo antes de llamar al doInBackground
, es suficiente.
Mi pregunta es, ¿dónde debo cerrar la conexión DB? ¿Es correcto usar una instancia única del ayudante DB en la Actividad y acceder a ella desde múltiples hilos (AsyncTasks
)? ¿O debería usar una instancia auxiliar DB separada para cada AsyncTask
?
Este es un esqueleto simplificada de mi actividad:
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
}
}
}
Entonces, básicamente, ¿debería usar while (! IsCancelled) {} en doInBackground y realizar todos los cálculos dentro del ciclo? – Marqs
Sí, y comprueba getStatus() en tu hilo principal para asegurarte de que AsyncTask ha finalizado. –
OK, pero ¿qué sucede si lo controlo onStop() y no ha terminado? ¿Dónde cerraría la conexión DB entonces? – Marqs