關(guān)于Adapter的The content of the adapter has changed問題造成的崩潰問題

1胸懈、問題描述
在使用Listview給Adapter填充數(shù)據(jù)的時候,在Mi max手機上下拉刷新的時候崩了恰响,當時只有這個手機遇到這個問題趣钱,其他手機都OK,log大概如下;

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. Make sure your adapter calls notifyDataSetChanged() when its content changes.

2胚宦、復(fù)現(xiàn)場景
使用ListView和Adapter實現(xiàn)動態(tài)增刪數(shù)據(jù)列表功能首有,初始化數(shù)據(jù)分為兩部分:本地和網(wǎng)絡(luò)。所以在Adapter的數(shù)據(jù)初始化的時候枢劝,先講本地數(shù)據(jù)添加到了容器內(nèi)井联。同時發(fā)起網(wǎng)絡(luò)請求,等加載完畢后追加到容器內(nèi)您旁。
問題出現(xiàn)在:當網(wǎng)絡(luò)請求完畢后追加數(shù)據(jù)的時候烙常,拋出上述異常。

3被冒、原因分析
Exception解讀:
Adapter的數(shù)據(jù)內(nèi)容已經(jīng)改變军掂,但是ListView卻未接收到通知轮蜕。要確保不在后臺線程中修改Adapter的數(shù)據(jù)內(nèi)容,而要在UI Thread中修改蝗锥。確保Adapter的數(shù)據(jù)內(nèi)容改變時一定要調(diào)用notifyDataSetChanged()方法跃洛。

當ListView緩存的數(shù)據(jù)Count和ListView中Adapter.getCount()不等時,會拋出該異常终议。

結(jié)合開頭的異常解讀汇竭,可以斷定肯定是Adapter數(shù)據(jù)動態(tài)更新的問題。仔細檢查了自己的代碼:
-我的情況
下拉的時候會去請求數(shù)據(jù)穴张,在網(wǎng)絡(luò)線程(非UI線程)然后判斷pageNum是否等于1细燎,如果等于1的話,list.clear(),然后把這個請求到的數(shù)據(jù)添加到list里面皂甘,但是這個處理是在runOnUiThread中玻驻,我分析的原因是,clear操作在子線程還未處理的時候偿枕,先執(zhí)行了list.add(),造成越界璧瞬。后來把處理都移到runOnUiThread中,如下:

        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                if (pageNum == 1) {
                    infoList.clear();
                }
                infoList.addAll(reList);
                adapter.setData(infoList);
                adapter.notifyDataSetChanged();
            }
        });

-其他情況
當網(wǎng)絡(luò)請求完畢后渐夸,直接在網(wǎng)絡(luò)線程(非UI線程)里調(diào)用了在Adapter中新增的自定義方法addData(List)更新數(shù)據(jù)嗤锉,而addData(List)方法內(nèi)更新?lián)Q完數(shù)據(jù)后,通過Handler發(fā)送Message的策略調(diào)用Adapter的notifyDataSetChanged()方法通知更新墓塌。

這么一來瘟忱,并不能保證Adapter的數(shù)據(jù)更新時,立馬調(diào)用notifyDataSetChanged()通知ListView苫幢,這兩個線程之間的時間差引起的數(shù)據(jù)不同步访诱,導(dǎo)致ListView的layoutChildren()中訪問Adapter的getCount()方法時,Adapter內(nèi)已經(jīng)是最新數(shù)據(jù)源态坦,而ListView內(nèi)的緩存數(shù)據(jù)Count仍是舊數(shù)據(jù)的Count盐数,該問題最終原因終于浮出水面。

歸根結(jié)底都是一個原因伞梯。

4玫氢、解決方案
在本例中,解決方案是:把addData(List)方法內(nèi)更新數(shù)據(jù)的代碼挪出來谜诫,和notifyDataSetChanged()方法一同放在Handler里漾峡,保證數(shù)據(jù)更新時及時通知ListView。

為了盡量避免該問題喻旷,以后編程盡量從如下幾個方面檢查自己的代碼:

確保Adapter的數(shù)據(jù)更新后一定要調(diào)用notifyDataSetChanged()方法通知ListView
數(shù)據(jù)更新和notifyDataSetChanged()放在UI線程內(nèi)生逸,且必須同步順序執(zhí)行,不可異步
仔細檢查確認getCount()方法返回值是否正確

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市槽袄,隨后出現(xiàn)的幾起案子烙无,更是在濱河造成了極大的恐慌,老刑警劉巖遍尺,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件截酷,死亡現(xiàn)場離奇詭異,居然都是意外死亡乾戏,警方通過查閱死者的電腦和手機迂苛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鼓择,“玉大人三幻,你說我怎么就攤上這事∧拍埽” “怎么了念搬?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長摆出。 經(jīng)常有香客問我锁蠕,道長,這世上最難降的妖魔是什么懊蒸? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮悯搔,結(jié)果婚禮上骑丸,老公的妹妹穿的比我還像新娘。我一直安慰自己妒貌,他們只是感情好通危,可當我...
    茶點故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著灌曙,像睡著了一般菊碟。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上在刺,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天逆害,我揣著相機與錄音,去河邊找鬼蚣驼。 笑死魄幕,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的颖杏。 我是一名探鬼主播纯陨,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了翼抠?” 一聲冷哼從身側(cè)響起咙轩,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎阴颖,沒想到半個月后活喊,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡膘盖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年胧弛,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片侠畔。...
    茶點故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡结缚,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出软棺,到底是詐尸還是另有隱情红竭,我是刑警寧澤,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布喘落,位于F島的核電站茵宪,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏瘦棋。R本人自食惡果不足惜稀火,卻給世界環(huán)境...
    茶點故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望赌朋。 院中可真熱鬧凰狞,春花似錦、人聲如沸沛慢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽团甲。三九已至逾冬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間躺苦,已是汗流浹背身腻。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留匹厘,地道東北人霸株。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像集乔,于是被迫代替她去往敵國和親去件。 傳聞我的和親對象是個殘疾皇子凉泄,可洞房花燭夜當晚...
    茶點故事閱讀 45,047評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,171評論 25 707
  • 簡介 在Android開發(fā)中ListView是比較常用的組件颜价。 以列表的形式展示具體內(nèi)容桑涎。 并且能夠根據(jù)數(shù)據(jù)的長度...
    上善若水Ryder閱讀 6,983評論 2 5
  • 在使用ListView過程中竭宰,有時會出現(xiàn)The content of the adapter has change...
    Drc15H閱讀 12,155評論 0 4
  • (一)Android面試題(一)Activity、Intent Android四大組件分別是哪些宫莱?各自有什么作用和...
    Itachi001閱讀 4,444評論 4 95
  • 戌時五刻,夜,歲在甲午,八月既望丈攒。白玉半輪,朗而星稀。前日凌晨風雨大作,雖雷雨交加,余臥于榻聞聲而醒覺,然安若泰山...
    譚笑生閱讀 221評論 3 1