什么是 ANR?ANR:application Not Responding,即應用無響應
ANR一般有三種類型:
KeyDispatchTimeout(5 seconds) –主要類型按鍵或觸摸事件在特定時間內無響應BroadcastTimeout(10 seconds) –BroadcastReceiver在特定時間內無法處理完成ServiceTimeout(20 seconds) –小概率類型 Service在特定的時間內無法處理完成KeyDispatchTimeoutAkey or touch event was not dispatched within the specified time(按鍵或觸摸事件在特定時間內無響應)具體的超時時間的定義在framework下的ActivityManagerService.java
//How long we wait until we timeout on key dispatching. static final int KEY_DISPATCHING_TIMEOUT = 5*1000超時時間的計數一般是從按鍵分發給app開始。超時的原因一般有兩種:(1)當前的事件沒有機會得到處理(即UI線程正在處理前一個事件,沒有及時的完成或者looper被某種原因阻塞住了)(2)當前的事件正在處理,但沒有及時完成
一些避免 ANRs 的技巧
建議使用 AsycnTask 來異步處理后臺數據相比起 AsycnTask 來說,創建自己的線程或者 HandlerThread 稍微復雜一點。如果你想這樣做,你應該通過 PRocess.setThreadPriority() 并傳遞 THREAD_PRIORITY_BACKGROUND 來設置線程的優先級為”background”。如果你的程序需要響應正在后臺加載的任務,在你的 UI 中可以顯示 ProgressBar 來顯示進度。對游戲程序,在工作線程執行計算的任務。如果你的程序在啟動階段有一個耗時的初始化操作,可以考慮顯示一個閃屏,要么盡快的顯示主界面,然后馬上顯示一個加載的對話框,異步加載數據。無論哪種情況,你都應該顯示一個進度信息,以免用戶感覺程序有卡頓的情況。使用性能測試工具,例如 Systrace 與 Traceview 來判斷程序中影響響應性的瓶頸。參考自Android ANR 分析解決方法官方文檔(中文版)
新聞熱點
疑難解答