Android:在AsyncTask中使用CustomAdaters关闭游标的位置

时间:2012-10-26 10:27:34

标签: android cursor android-cursoradapter

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

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是使用CursorAdaptergetView()方法的自定义newView()

如果我运行上一代码,我会收到以下错误:

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

似乎{1}}和getView()方法在UI线程上运行!!!!!!

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

请帮帮我!!!

3 个答案:

答案 0 :(得分:0)

你确定需要放入asynctask吗?在我看来,你正在更新UI?

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

答案 1 :(得分:0)

onPostExcute()上执行此操作。

doInBackground()是一个工作线程。

并且onPreXecute()onPostExcute()UIThread.

中运行

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

onPostExcute()

上这样做

答案 2 :(得分:0)

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

正如其他人所说,将光标重置为UI线程上的CursorAdapterAsyncTask.onPostExecute()中)。