如何定位ANR
如果是在開發機器上出現問題,我們可以通過查看/data/anr/traces.txt即可,最新的ANR信息在最開始部分。
列舉幾種容易出現的問題
主線程被IO操作(從4.0之後網絡IO不允許在主線程中)阻塞。
主線程中存在耗時的計算
主線程中錯誤的操作,比如說,Thread.wait或者Thread.sleep等,Android系統會監控程序的相應狀況,一旦出現上面兩種情況,則會彈出ANR對話框
用戶在5秒內未響應用戶的輸入時間(如按鍵或者觸摸)
BroadcastReceiver未在10秒內完成相關的處理
Service在特定的時間內無法處理完成 20秒
使用AsyncTask處理耗時IO操作。
使用Thread或者HandlerThread時,調用Process.setThreadPriority(Process.THREADPRIORITYBACKGROUND)設置優先級,否則仍然會降低程序響應,因爲默認Thread的優先級和主線程相同。
使用Handler處理工作線程結果,而不是使用Thread.wait()或者Thread.sleep()來阻塞主線程。
Activity的onCreate和onResume回調中儘量避免耗時的代碼
BroadcastReceiver中onReceive代碼也要儘量減少耗時,建議使用IntentService處理。