0

我有一个大问题..这是代码:

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()andnewView()方法的自定义

如果我运行前面的代码,我会收到以下错误:

java.lang.IllegalStateException: attempt to re-open 
an already-closed object: android.database.sqlite.SQLiteQuery

似乎 getView()newView()方法在 UI 线程上运行!!!!!!

问题很简单:我该放在cursor.close()哪里?我不想使用 CursorLoader 和/或 startManagingCursor(..)

请帮我!!!

4

3 回答 3

0

您确定需要放入异步任务吗?在我看来,您正在更新 UI?

此外,尽量限制光标以获得最佳效果;打开,获取信息,将信息放入新变量,关闭。

于 2012-10-26T10:30:20.937 回答
0

做它onPostExcute()

doInBackground()是一个工作线程。

并且onPreXecute()运行onPostExcute()UIThread.

在您的代码中,您使用的是context,因此它在方法中可能不再有效doInBackground()

所以就这样做onPostExcute()

于 2012-10-26T10:41:29.207 回答
0

只要用户使用您的 listView,获取的Cursor实例就会被使用。CursorAdapter这就是为什么你不应该这么早关闭光标。每当您的 Activity 实例即将被销毁时,就该关闭该游标了。或者每当您更改光标时(如果您的应用程序就是这种情况) ,请CursorAdapter关闭之前使用的光标。

正如其他人所说,将光标重置到CursorAdapterUI 线程上(在 中AsyncTask.onPostExecute())。

于 2012-10-26T10:48:06.897 回答