AsyncTask de Android y instancia de SQLite DB

Tengo un problema y no estoy seguro de cómo abordarlo. Una actividad en mi aplicación tiene varias AsyncTask s que acceden a SQLiteOpenHelper . I inicializar y abrir el ayudante en onCreate() y lo estoy cerrando en onStop() . También compruebo si se ha inicializado en onResume() .

Desde que he publicado mi aplicación he recibido número de errores con Null Exception en doInBackground donde intento acceder al ayudante de DB. Sé que esto sucede porque el DB está cerrado ( onStop() ) justo antes de que doInBackground se llame, lo suficientemente justo.

Mi pregunta es, ¿dónde debo cerrar la conexión DB? ¿Es correcto usar una sola instancia del ayudante de DB en la Actividad y acceder a ella desde múltiples subprocesos ( AsyncTasks )? ¿O debo usar la instancia separada del ayudante de la base de datos para cada AsyncTask ?

Este es un esqueleto simplificado 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 } } } 

Ha mencionado que cancela el AsyncTask antes de cerrar el DB. Pero debe tener en cuenta que la cancelación de AsyncTask sólo señala la tarea que se cancelará y es necesario comprobar isCancelled () en doInBackground () y hacer lo necesario para detener las operaciones de DB.

Antes de cerrar el DB, debe comprobar getStatus () para asegurarse de que el AsyncTask se ha detenido.

No es necesario administrar la conexión db para cada actividad. Puede hacerlo en una instancia de android.app.Application y acceder a db utilizando esta instancia. Algo como esto:

 public class MyApplication extends Application { // Synchronized because it's possible to get a race condition here // if db is accessed from different threads. This synchronization can be optimized // thought I wander if it's necessary public synchronized static SQLiteDatabase db() { if(self().mDbOpenHelper == null) { self().mDbOpenHelper = new MyDbOpenHelper(); } return self().mDbOpenHelper.getWritableDatabase(); } public static Context context() { return self(); } @Override public void onCreate() { super.onCreate(); mSelf = this; } private static MyApplication self() { if (self == null) throw new IllegalStateException(); return mSelf; } private MyDbOpenHelper mDbOpenHelper; private static MyApplication mSelf; } 

De esta manera usted puede estar seguro de que Db siempre es accesible.

Y sí, tener una instancia de ayudante Db es una buena práctica. La sincronización de subprocesos se realiza por defecto.

Es bueno usar un solo DB Helper . El problema es que cuando el usuario abandona la Activity el DB está cerrado pero el AsyncTask todavía puede ejecutarse. Por lo tanto, debe comprobar que el DB no es nulo cuando está intentando acceder a él, y si es null esto puede significar que su Activity fue destruida y cancel esa tarea.

  • Android obtener la imagen de disco de base de datos es malformado (código 11) error
  • Android SqliteAssetHelper - fusionar las tablas de la base de datos del activo con el existente
  • GetReadableDatabase a menudo, pero no siempre devuelve null
  • SQLiteOpenHelper "onCreate" no se llama? (El DB no existe)
  • Por qué necesitamos onUpgrade (); Método en la clase SQLiteOpenHelper
  • ¿Cuál es la manera más rápida de analizar una cadena JSON en una tabla SQLite?
  • Insertar datos JSON en la base de datos SQLite en android
  • cómo crear base de datos una sola vez, a continuación, leer y escribir varias veces desde él, SQLite, OpenHelper, Android
  • Excepción fatal: error desconocido (código 14) no se pudo abrir la base de datos
  • Error al leer la fila 0, columna 0 de una CursorWindow que tiene 0 filas, 64 columnas
  • No se puede bajar la base de datos de la versión `n` a` n-1` en Samsung
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.