ANR產生原因和處理

ANR定義

ANR是Application Not Responding的縮寫,指應用無響應。這是Android設計的一種機制,希望我們在其規定時間內完成動作,如果沒有完成,給用戶提示某一過程耗時太長。

ANR產生原因

接着上面所說,系統希望我們在其規定時間內完成動作,也就是它寫入了一些時間配置,超過這個配置的時間就彈出提示框。有以下幾種:

  • KeyDispatchTimeout輸入事件(鍵盤輸入KeyEvent和MotionEvent觸摸事件)5s無響應;
  • BroadcastTimeout廣播10s無響應;
  • ServiceTimeout服務20s無響應;
  • ContentProvider超時,不過很少見。

一般情況都是由於我們在主線程做了耗時操作,包括:

  • 網絡請求,IO操作,數據庫操作
  • 打開wifi(因爲跨進程操作,有可能wifiserver那邊處理超時)
  • SharedPreferences的commit操作,但事實證明,頻繁調用apply方法也可能引起ANR.參考剖析 SharedPreference apply 引起的 ANR 問題
  • 數據庫查詢語句,在數據庫量巨大時可能產生
  • bitmap的處理
  • 等等

ANR排查

  • BlockCanary
  • 追蹤trace.txt文件,一般設備在/data/anr下面,需要root才能adb pull /data/anr/traces.txt D:anr/拉出來;如果沒有就只有使用adb bugreport來生成zip文件,解壓得到trace.txt
  • log 查找 搜索 anr 會搜到一段異常信息
    在這裏插入圖片描述

ANR處理

核心就是不要在主線程做耗時操作,應當將耗時操作異步執行,即放入其他線程執行。

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