ANR——應用程序無響應對話框

ANR的定義

ANR全稱是Application Not Responding(應用程序無響應),在Android上,應用程序如果沒有響應,系統會向用戶顯示一個對話框,這個對話框稱作應用程序無響應對話框。用戶可以選擇等待或者強制關閉。所以一個流暢的合理的應用程序中不能出現ANR,而讓用戶每次都要處理這個對話框,因此,程序裏對響應性能的設計很重要,這樣系統不會顯示ANR給用戶。

應用程序出現ANR的原因

1.按鍵或觸摸事件在特定時間(5 seconds)內無響應,
2.BroadcastRecetver在特定時間(10 seconds)內無法處理完成,
3.Service在特定時間(20 seconds)內無法處理完成,
4.UI線程被其他操作阻塞(子線程調用UI線程的join方法);
5.主線程存在耗時操作(本地IO操作、網絡訪問、循環等)

如何分析ANR

1、CPU 問題
在 Monkeylog.log 文件中定位到 “anr in” 位置,查看 cpu usage ?total 佔用,如發現接近100%,暫時判斷爲 cpu 問題。然後在 logcat.log 文件中定位到 “not responding” 發生時間,並截取cpuinfo.log 中時間點前後 5s 的 log,然後計算 CPU 佔中,看哪個進程用的多,在酌情分析模塊的 CPU 佔中。
2、GC 問題
定位到 logcat.log 文件中 “not responding” 發生時間點;
查看發生 ANR 時間點對應的 trace 文件,定位到應用包名package,若Dalvik Thread主線程顯示“SUSPENDED”,則爲內存問題。
截取 ANR 發生時間點前 5s 的 log,分析 “dalvikvm” 打印的 Paused GC 耗時,如果過多則定位爲 GC 問題,需要查看這 5s 件發生了哪些耗時的操作。

如何避免ANR

注意:發生 GC 的進程 id 需要和當前發生 ANR 的線程 id 的要一致
1.合理使用 UI 主線程,耗時操作放入其他線程工作;
2.合理使用 Handler?異步消息處理機制來處理其他線程請求。
3.合理使用並遵循 Android 生命週期, 避免在 onCreate() and onResume()做過多的事情;
4.使用一些架構形成規範來避免內存等問題,例如:MVP、RxJava;
5.經常使用工具來檢查內存問題,例如:MAT、TraceView、AS 自帶等工具;
6.避免加載大圖片引起內存不足導致 ANR;

避免內存泄露引起的 ANR。

ANR異常也是在程序中自己經常遇到的問題,主要的解決辦法把耗時的操作放在子線程中來實現,比如採用Handler+mesage的方式,或者是有時候需要做一些和網絡相互交互的耗時操作就採用asyntask異步任務的方式(它的底層其實Handler+mesage有所區別的是它是線程池)等。

面試:如何快速找到應用程序出現ANR的原

查看Log和trace文件可以快速找到ANR的原因。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章