Похоже, вам нужно синхронизировать блок, в котором вы устанавливаете свой адаптер в onPostExecute. Проблема в том, что AsyncTask работает в отдельном потоке, порядок, в котором курсор установлен и впоследствии запрошен, не гарантируется. Попробуй это..
аюсь выяснить, почему иногда я получаю исключение IllegalStateException. Я не могу найти хороших примеров, которые показывают, как загрузить список, используя поток для запроса базы данных SQLite. Я включил свой код ниже. Большую часть времени он работает правильно, но иногда я получаю исключение IllegalStateException.
Я также получил подобное исключение в другой моей деятельности, которая является экземпляром ExpandableListActivity. Это исключение гласит «попытка запросить уже закрытый курсор».
Может кто-нибудь сказать мне правильный способ сделать это, чтобы это не вызывало ошибок? Я бы предпочел использовать курсоры, а не копировать все данные в память. Если я не могу понять это, мне придется загрузить все это в память.
Я думаю, что проблема связана с startManagingCursor (Cursor) и с тем фактом, что соединение с базой данных закрыто в onDestroy (). Пожалуйста, помогите
- сказка
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) {
// ...
}
}
}