ANR的全稱(chēng)是application not responding眼溶,是指應(yīng)用程序未響應(yīng),Android系統(tǒng)對(duì)于一些事件需要在一定的時(shí)間范圍內(nèi)完成绰筛,如果超過(guò)預(yù)定時(shí)間能未能得到有效響應(yīng)或者響應(yīng)時(shí)間過(guò)長(zhǎng),都會(huì)造成ANR骏庸。一般地,這時(shí)往往會(huì)彈出一個(gè)提示框硬猫,告知用戶(hù)當(dāng)前xxx未響應(yīng)坑雅,用戶(hù)可選擇繼續(xù)等待或者Force Close。
首先ANR的發(fā)生是有條件限制的蜂林,分為以下三點(diǎn):
1.只有主線(xiàn)程才會(huì)產(chǎn)生ANR矮锈,主線(xiàn)程就是UI線(xiàn)程苞笨;
2.必須發(fā)生某些輸入事件或特定操作,比如按鍵或觸屏等輸入事件粤咪,在BroadcastReceiver或Service的各個(gè)生命周期調(diào)用函數(shù);
3.上述事件響應(yīng)超時(shí),不同的context規(guī)定的上限時(shí)間不同
a.主線(xiàn)程對(duì)輸入事件5秒內(nèi)沒(méi)有處理完畢
b.主線(xiàn)程在執(zhí)行BroadcastReceiver的onReceive()函數(shù)時(shí)10秒內(nèi)沒(méi)有處理完畢
c.主線(xiàn)程在Service的各個(gè)生命周期函數(shù)時(shí)20秒內(nèi)沒(méi)有處理完畢艾疟。
那么導(dǎo)致ANR的根本原因是什么呢弟疆?簡(jiǎn)單的總結(jié)有以下兩點(diǎn):
1.主線(xiàn)程執(zhí)行了耗時(shí)操作同廉,比如數(shù)據(jù)庫(kù)操作或網(wǎng)絡(luò)編程
2.其他進(jìn)程(就是其他程序)占用CPU導(dǎo)致本進(jìn)程得不到CPU時(shí)間片锅劝,比如其他進(jìn)程的頻繁讀寫(xiě)操作可能會(huì)導(dǎo)致這個(gè)問(wèn)題。
細(xì)分的話(huà)诬垂,導(dǎo)致ANR的原因有如下幾點(diǎn):
1.耗時(shí)的網(wǎng)絡(luò)訪(fǎng)問(wèn)
2.大量的數(shù)據(jù)讀寫(xiě)
3.數(shù)據(jù)庫(kù)操作
4.硬件操作(比如camera)
5.調(diào)用thread的join()方法充蓝、sleep()方法、wait()方法或者等待線(xiàn)程鎖的時(shí)候
6.service binder的數(shù)量達(dá)到上限
7.system server中發(fā)生WatchDog ANR
8.service忙導(dǎo)致超時(shí)無(wú)響應(yīng)
9.其他線(xiàn)程持有鎖悠垛,導(dǎo)致主線(xiàn)程等待超時(shí)
10.其它線(xiàn)程終止或崩潰導(dǎo)致主線(xiàn)程一直等待
那么如何避免ANR的發(fā)生呢或者說(shuō)ANR的解決辦法是什么呢确买?
1.避免在主線(xiàn)程執(zhí)行耗時(shí)操作,所有耗時(shí)操作應(yīng)新開(kāi)一個(gè)子線(xiàn)程完成派草,然后再在主線(xiàn)程更新UI艺普。
2.BroadcastReceiver要執(zhí)行耗時(shí)操作時(shí)應(yīng)啟動(dòng)一個(gè)service搏存,將耗時(shí)操作交給service來(lái)完成缩焦。
3.避免在Intent Receiver里啟動(dòng)一個(gè)Activity盖桥,因?yàn)樗鼤?huì)創(chuàng)建一個(gè)新的畫(huà)面题翻,并從當(dāng)前用戶(hù)正在運(yùn)行的程序上搶奪焦點(diǎn)藐握。如果你的應(yīng)用程序在響應(yīng)Intent廣 播時(shí)需要向用戶(hù)展示什么袜炕,你應(yīng)該使用Notification Manager來(lái)實(shí)現(xiàn)。
本文參考:http://www.reibang.com/p/7fd95bc2a55c