java.lang.IllegalStateException: tente reabrir um objeto já fechado

Estou tentando descobrir por que ocasionalmente estou recebendo a IllegalStateException. Não consigo encontrar bons exemplos que mostrem como carregar uma lista usando um thread para consultar um banco de dados SQLite. Incluí meu código abaixo. Na maioria das vezes, ele funciona corretamente, mas, ocasionalmente, estou recebendo a IllegalStateException.

Eu também recebi uma exceção semelhante em outra atividade minha que é uma instância do ExpandableListActivity. Essa exceção indica "tentando solicitar um cursor já fechado".

Alguém pode me dizer a maneira correta de fazer isso para que não cause erros? Eu preferiria usar os cursores em vez de copiar todos os dados na memória. Se eu não conseguir descobrir isso, terei que carregar tudo na memóri

Acho que o problema tem algo a ver com startManagingCursor (Cursor) e o fato de a conexão com o banco de dados estar fechada em onDestroy (). ajuda plz
-- cont

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

questionAnswers(2)

yourAnswerToTheQuestion