我有一个大问题..这是代码:
private class ViewDataTableTask extends AsyncTask<Void, Void, String> {
...
protected String doInBackground(Void... params) {
Cursor listCursor = db.rawQuery("SELECT ..." , null);
ListView table_body = new ListView(context);
try{
table_body.setAdapter(new MyAdapter(context , listCursor));
}finally{
if(listCursor != null){
listCursor.close();
}
...
}
...
}
MyAdapter是使用CursorAdapter
和getView()
方法的自定义newView()
如果我运行上一代码,我会收到以下错误:
java.lang.IllegalStateException: attempt to re-open
an already-closed object: android.database.sqlite.SQLiteQuery
似乎{1}}和getView()
方法在UI线程上运行!!!!!!
问题很简单:我要把newView()
放在哪里?
我不想使用CursorLoader和/或startManagingCursor(..)
请帮帮我!!!
答案 0 :(得分:0)
你确定需要放入asynctask吗?在我看来,你正在更新UI?
另外,尽量限制光标以获得最佳效果;打开,获取信息,将信息放入新变量,关闭。
答案 1 :(得分:0)
在onPostExcute()
上执行此操作。
doInBackground()
是一个工作线程。
并且onPreXecute()
和onPostExcute()
在UIThread.
在您的代码中,您使用的是context
,因此在doInBackground()
方法中可能不再有效。
在onPostExcute()
答案 2 :(得分:0)
只要用户使用listView,Cursor
将使用获得CursorAdapter
实例。这就是为什么你不应该这么早关闭光标的原因。每当您的Activity实例即将被销毁时,就可以关闭该光标了。或者,当您为CursorAdapter
更改光标(如果是您的应用的情况)时,请关闭之前使用的光标。
正如其他人所说,将光标重置为UI线程上的CursorAdapter
(AsyncTask.onPostExecute()
中)。