2011-03-02 45 views
3

我的問題與Android有關。我有以下代碼(非相關的部分省略):Android:SQLiteCursor/SimpleCursorAdapter在後臺

public class MyActivity extends ListActivity { 
    protected void onResume() { 
     super.onResume(); 
     new UpdateTask().execute(); 
    } 

    private class UpdateTask extends AsyncTask<Object, Object, ListAdapter> { 
     protected ListAdapter doInBackground(Object... params) { 
      SQLiteCursor cursor = db.getSomeData(); 
      startManagingCursor(cursor); 
      SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, ..., cursor, ..., ...); 
      return adapter; 
     } 

     protected void onPostExecute(ListAdapter result) { 
      listView.setAdapter(result); 
     } 
    } 
} 

這將導致一個RuntimeException - 在該行「()內螺紋已不叫Looper.prepare無法創建處理程序」,其中SimpleCursorAdapter實例化。

我明白爲什麼會發生這種情況,我只是不知道如何解決它(將它保存在一個單獨的線程中)。我發現這個線程:

http://groups.google.com/group/android-developers/browse_thread/thread/34d0069bb2de925e?fwc=2

但我真的不明白的答覆。我沒有谷歌任何 例子涉及SQLiteCursor和AsyncQueryHandler。

請問你們能幫忙嗎?謝謝。

回答

5

它看起來像實例化SimpleCursorAdapter必須發生在UI線程上。您可以通過doInBackground()返回cursor並在onPostExecute()中設置適配器來完成此操作。

請參閱Painless Threading如果您還沒有。

+0

你是對的。但是如果光標像成千上萬條記錄一樣返回,會不會阻塞UI線程? – Jarek

+3

我認爲一旦返回遊標就會完成初始查詢,即使它有很多記錄,適配器也不會停止。 現在,[Javadocs](http://developer.android.com/reference/android/widget/SimpleCursorAdapter.html)顯示'SimpleCursorAdapter'構造函數在API Level 11中被棄用,因爲_requerying_將會發生在UI線程,當底層內容廣播一個變化時。 如果您針對較早的API進行開發,您似乎必須忍受UI線程中的重新查詢,或者推出自己的「ResourceCursorAdapter」。 –

+0

我正在使用API​​級別7.我想我將不得不執行一些測試來查看SimpleCursorAdapter的真實行爲。但即使我發現它阻止了UI線程,但我可能不得不離開它,因爲我沒有看到任何其他選項。謝謝,羅伯特。 – Jarek

0

只是把Looper.prepare();在拋出這樣一個錯誤的方法的頂部