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) {
            // ...
        }
    }
}

Respuestas a la pregunta(2)

Su respuesta a la pregunta