2012-10-26 65 views
0

接近光標我有一個很大的問題。這是代碼:安卓:凡使用CustomAdaters在AsynTask

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 

似乎getView()newView()在UI線程上運行的方法!!!!!!

問題很簡單:我要把cursor.close()放在哪裏? 我不想使用CursorLoader和/或startManagingCursor(..)

請幫我!!!

回答

0

的得到了Cursor實例將通過CursorAdapter,只要用戶使用您的ListView使用。這就是爲什麼你不應該這麼早關閉光標的原因。每當您的活動實例即將銷燬時,都應該關閉該遊標。或者,如果您更改了光標(如果這是您的應用的情況),那麼請關閉以前使用的光標。

正如其他人所說,在UI線程(在AsyncTask.onPostExecute())上將光標重置爲CursorAdapter

0

你確定你需要放置一個asynctask嗎?對我來說就像你正在更新UI?

此外,儘量限制遊標以獲得最佳結果;打開,獲取信息,將信息放入新變量中,關閉。

0

onPostExcute()上做。

doInBackground()是一個工作者線程。

onPreXecute()onPostExcute()UIThread.

在你的代碼使用的是context運行,所以它可能是doInBackground()方法內不再有效。

這樣做對onPostExcute()