一直以來都知道更新 UI 時,要使用 UI Thread 來進行,有幾種方式:

  • 使用 Handler.post
  • 使用 YourActivity.this.runOnUiThread
  • 使用 mListView.post 

然而今天練習時卻一直蹦出錯誤訊息:

AndroidRuntime FATAL EXCEPTION: main
java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not modified from a background thread, but only from the UI thread.

因為我在背景跑了 Thread 來更新資料,更新完資料在請 Handler 或 runOnUiThread 來更新 ListView,卻依舊碰到上述的錯誤訊息,最後才發現...那就是 ListView 的 Adapter 一開始在初始化時,有指定一個 ListAdapter 給他,那時有綁定一個 List/ArrayList 結構來記錄要顯示的資料(在此簡稱 mItemList),我一直以為只要 mSimpleAdapter.notifyDataSetChanged 、 mListView.requestLayout 在 UIThread 做就好,沒想到那個 mItemList 的增減也必須在 UIThread 做才行。這個 bug 不是每次都會出現,但出現的比例不低啦 :P

總之,解法就把 mItemList 的更新也都在 UIThread 做就行了 :P


, , , , , ,

changyy 發表在 痞客邦 PIXNET 留言(0) 人氣()