gpt4 book ai didi

android - java.lang.IllegalStateException : attempt to re-open an already-closed object 错误

转载 作者:太空宇宙 更新时间:2023-11-03 13:36:37 26 4
gpt4 key购买 nike

我想弄清楚为什么我偶尔会遇到 IllegalStateException。我找不到任何好的示例来说明如何使用线程加载列表来查询 SQLite 数据库。我在下面包含了我的代码。大多数时候它工作正常,但偶尔会出现 IllegalStateException。

我在我的另一个 Activity 中也遇到了类似的异常,该 Activity 是 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) {
// ...
}
}
}

最佳答案

查看AsyncQueryHandler如果你想以你想要的方式查询数据库。

您的任务 RetrieveCursorTask 在单独的线程上运行,因此当您的 Activity 被销毁时,您的 AsyncTask 可能仍在后台运行,但由于您在主 Activity onDestroy 中关闭了光标,它可能会在 AsyncTask 返回后再次被查询。

关于android - java.lang.IllegalStateException : attempt to re-open an already-closed object 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6393584/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com