2013-06-12 50 views
0
@ 
Override 
protected Boolean doInBackground(final String...params) { 

    runOnUiThread(new Runnable() { 
      public void run() { 

問題是,當AysncTask執行和onPostExecute()被調用已runOnUiThread。我得到下面的例外。我們能否在doInBackground()

java.lang.IllegalStateException:適配器的內容更改爲 ,但ListView未收到通知。確保您的適配器的 內容不是從後臺線程修改的,而是僅從修改的UI線程。 [ListView中(2131034153,類 android.widget.ListView)與適配器(類 COM .... tracebuzz.allresults.AllResultsAdapter)]

問題是綁定到我的AdapterArrayList改變後臺線程。

The content of the adapter has changed but ListView did not receive a notification - With AsyncTask

以上問題是我的確切情況,但我只是不知道如何在我的情況下適用,如果有這樣的10 ArrayList得到修改回地面線程和10 Adapaters它需要通知。

回答

0

請勿僅在UI線程中更改後臺線程中的適配器數據。後臺線程應創建本地變量列表,並在onPostExecute上,或通過runOnUiThread將列表複製到適配器列表並調用notifyDataSetChanged

0

只需將notifyDataSetChanged移動到異步任務的onPostExecute方法即可。此方法在doInBackground完成後在UI線程上運行。這樣您就可以在後臺下載和更新適配器內容,並刷新UI線程上的實際視圖。

0

我想你應該可以在AsyncTask中的ui Thread上運行代碼。

如果你沒有進入的背景下,除了使用

new Handler(Looper.getMainLooper()).post(youRunnable); 
0

我曾經有過同樣的問題。我嘗試了很多東西,包括runOnUiThread,但我認爲最好的解決方案是在AsyncTask中創建一個臨時ArrayList,以填充它在doInBackground()中。然後,您可以將所有這些元素都刷新到真正的ArrayList中,並通過onPostExecute()方法(在UI線程上運行)通知適配器。