java.lang.IllegalStateException: intente volver a abrir un objeto ya cerrado
Estoy tratando de entender por qué ocasionalmente obtengo la IllegalStateException. No puedo encontrar ningún buen ejemplo que muestre cómo cargar una lista usando un hilo para consultar una base de datos SQLite. He incluido mi código a continuación. La mayoría de las veces funciona correctamente, pero ocasionalmente obtengo la IllegalStateException.
También obtuve una excepción similar en otra actividad mía que es una instancia de ExpandableListActivity. Que los estados de excepción "que intenta volver a consultar un cursor ya cerrado".
¿Puede alguien decirme la forma correcta de hacer esto para que no cause ningún error? Yo preferiría utilizar los cursores en lugar de copiar todos los datos en la memoria. Si no puedo resolver esto entonces voy a tener que cargar todo en la memoria.
I que el problema tiene algo que ver con startManagingCursor (cursor) y el hecho de que la conexión de base de datos se cierra en OnDestroy (). PLZ ayuda
-- cuent
public class MyListActivity extends ListActivity {
private MyCursorAdapter adapter;
private SQLiteDatabase db = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
try {
new RetrieveCursorTask(this).execute((Void[]) null);
} catch (Exception e) {
}
}
@Override
protected void onDestroy() {
super.onDestroy();
// Null out the cursor.
if (adapter != null) {
adapter.changeCursor(null);
adapter = null;
}
if (db != null && db.isOpen()) {
db.close();
}
}
private class RetrieveCursorTask extends AsyncTask<Void, Void, Cursor> {
private Context ctx;
public RetrieveCursorTask(Context ctx) {
this.ctx = ctx;
}
@Override
protected Cursor doInBackground(Void... params) {
Cursor cursor = null;
DbHelper helper = new DbHelper(ctx);
try {
db = helper.getReadableDatabase();
cursor = db.query("users",
new String[] {
DbHelper.ID_COLUMN,
DbHelper.UID_COLUMN
},
null, null, null, null, null);
startManagingCursor(cursor);
} catch (Exception e) {
}
return cursor;
}
@Override
protected void onPostExecute(Cursor cursor) {
super.onPostExecute(cursor);
if (cursor != null) {
try {
adapter = new MyCursorAdapter(ctx, cursor);
} catch (Exception e) {
}
setListAdapter(adapter);
}
}
}
private class MyCursorAdapter extends CursorAdapter {
private Context ctx;
public MyCursorAdapter(Context context, Cursor c) {
super(context, c);
this.ctx = context;
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
// ...
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
// ...
}
}
}