一直以來都知道更新 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
不好意思 你能不能PO一段程式碼示範呢?或是有源碼可以參考
回覆刪除這樣敘述我不是很懂.................麻煩了!
歹勢...很久沒寫 android app 了 XD 找不太到完整的範例。
回覆刪除這篇只是提醒...有些資料變更時,會馬上影響到 UI 的,像這類更動就一併在 UI Thread 操作吧!