ANR是個什么玩意
ANR嘉赎,是“Application Not Responding”的縮寫,即“應用程序無響應”。系統(tǒng)會向用戶顯示一個對話框,用戶可以選擇“等待”而讓程序繼續(xù)運行吗冤,也可以選擇“強制關(guān)閉”。
在Android中九府,應用程序的響應是由Activity Manager和WindowManager系統(tǒng)服務監(jiān)視的 椎瘟。當它監(jiān)測到A、B侄旬、C情況中的一個時肺蔚,Android就會針對特定的應用程序顯示ANR:
A.在5秒內(nèi)沒有響應輸入的事件(例如,按鍵按下儡羔,屏幕觸摸)--主要類型
B.BroadcastReceiver在10秒內(nèi)沒有執(zhí)行完畢
C.Service在特定時間內(nèi)(20秒內(nèi))無法處理完成--小概率類型
造成ABC的原因有很多宣羊,比如在主線程中做了非常耗時的操作,如下載笔链,io異常等段只。還需要注意的是產(chǎn)生這種ANR的前提是要有輸入事件,如果用戶沒有觸發(fā)任何輸入事件鉴扫,即便是主線程阻塞了,也不會產(chǎn)生ANR澈缺,因為InputDispatcher沒有分發(fā)事件給應用程序坪创,當然也不會檢測處理超時和報告ANR了。
1.如何分析ANR
ANR發(fā)生時都會在log中輸出錯誤信息姐赡,從log中可以獲得ANR的類型莱预,CPU的使用情況,CPU使用率過高有可能是CPU饑餓導致了ANR项滑。CPU使用率過低說明主線程被block了依沮,如果IOwait高是因為主線程進行I/O操作造成的。
除了log輸出外枪狂,你會發(fā)現(xiàn)各個應用進程和系統(tǒng)進程的函數(shù)堆棧信息都輸出到了一個/data/anr/traces.txt的文件中危喉,這個文件是分析ANR原因的關(guān)鍵文件.要獲取到該文件可使用adb指令進行賦權(quán)后拉出查看調(diào)用stack。通過log州疾、trace.text辜限、代碼結(jié)合分析ANR的成因(iowait?Memoryleak严蓖?Block薄嫡?)
2.怎么避免ANR
要避免問題的產(chǎn)生氧急,就要抓住問題產(chǎn)生的原因(ABC三種):
(1)避免在主線程上進行復雜耗時的操作,比如說發(fā)送接收網(wǎng)絡數(shù)據(jù)/進行大量計算/操作數(shù)據(jù)庫/讀寫文件等毫深。這個可以通過使用AsyncTask或者使用多線程來實現(xiàn)吩坝。
(2)broadCastReceiver 要進行復雜操作的的時候,可以在onReceive()方法中啟動一個Service來處理
(3)在設計及代碼編寫階段避免出現(xiàn)出現(xiàn)同步/死鎖或者錯誤處理不恰當?shù)惹闆r哑蔫。
作者:youseewhat
鏈接:http://www.reibang.com/p/9db73a26a8bd
來源:簡書
簡書著作權(quán)歸作者所有钉寝,任何形式的轉(zhuǎn)載都請聯(lián)系作者獲得授權(quán)并注明出處。