在Android編程中使用Adapter時,偶爾會出現以下錯誤:
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。
DDMS中的log也沒法定位到準確的出錯位置。檢查錯誤能夠從下面幾點入手:
一、檢查Thread,肯定沒有在Background thread中直接調用adapter,若是有,請移除相關代碼到Handler中處理;
二、儘可能將數據放在adapter類中管理,不須要的時候清除信息(勤寫clear()),及時用notifyDataSetChanged()刷新;
三、在Activity或者Fragment合適的位置(onPause/onStop)要及時檢查thread,有adapter數據處理相關的應立刻中止;
四、這個錯誤常常出如今Activity休眠起來以後,主要仍是使用adapter不過小心形成的。若是實在找不到緣由,在onPause()函數中中止全部的background thread,而且在onResume()函數最前面清空adapter中的數據,而且adapter.notifyDataSetChanged()。而後從新更新加載數據,這樣通常能夠解決問題。
在Android開發過程當中,使用了大量的ListView,發現這個錯誤偶爾會出現。特別是作壓力測試的時候,不停的點擊刷新,更容易出現這個錯誤。代碼中已經使用了Adapter的notifyDataSetChanged()方法通知UI更新了,可是仍是會出現這個錯誤。究其根本緣由,仍是線程之間同步的問題。好比,線程1更新了Adapter中的內容,卻尚未來得及通知內容已經更新,就又有線程2更新了Adapter中的內容,這個時候若是線程1再通知內容更新,就會出現上述異常了。編程
在此提出一些解決辦法:函數
對線程進行管理,若是當前Actitivty暫停了,及時中止這些線程。測試
數據更新後,要及時使用notifyDataSetChanged()方法通知UI,避免出現數據不一致的狀況。spa
數據的更新,最好放在主線程中進行。這樣可使用同步數據更新與通知內容更新部分的代碼。線程
總結:開發
若是listview有數據更新,其己經改變了adapter的getCount()方法。此時必需要通知adapter更新數據,不然就會報adapter數據不匹配的錯誤。當adapter發生變化,即刻調用notifyDataSetChanged方法,避免出現數據不一致的狀況。get