2012年8月16日 星期四

Android 開發筆記 - 更新 ListView 之 AndroidRuntime FATAL EXCEPTION 之 UI Thread 問題

一直以來都知道更新 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


2 則留言:

  1. 不好意思 你能不能PO一段程式碼示範呢?或是有源碼可以參考
    這樣敘述我不是很懂.................麻煩了!

    回覆刪除
  2. 歹勢...很久沒寫 android app 了 XD 找不太到完整的範例。
    這篇只是提醒...有些資料變更時,會馬上影響到 UI 的,像這類更動就一併在 UI Thread 操作吧!

    回覆刪除