淺談ANR如何分析解決ANR(1)

一:什麼是ANR
                  ANR:Application Not Responding,即應用無響應
二:ANR的類型
                  ANR一般有三種類型:
                  1:KeyDispatchTimeout(5 seconds) --主要類型
                  按鍵或觸摸事件在特定時間內無響應
                  2:BroadcastTimeout(10 seconds)
                  BroadcastReceiver在特定時間內無法處理完成
                  3:ServiceTimeout(20 seconds) --小概率類型
                  Service在特定的時間內無法處理完成
  三:KeyDispatchTimeout
                  Akey or touch event was not dispatched within the specified 
                  time(按鍵或觸摸事件在特定時間內無響應)
                  具體的超時時間的定義在framework下的
                  ActivityManagerService.java
                  //How long we wait until we timeout on key dispatching.
                  staticfinal int KEY_DISPATCHING_TIMEOUT = 5*1000
四:爲什麼會超時呢?
                  超時時間的計數一般是從按鍵分發給app開始。超時的原因一般有兩種:
                  (1)當前的事件沒有機會得到處理(即UI線程正在處理前一個事件,沒有及時的完成或者looper被某種原因阻塞住了)
                  (2)當前的事件正在處理,但沒有及時完成
五:如何避免KeyDispatchTimeout
                  1:UI線程儘量只做跟UI相關的工作
                  2:耗時的工作(比如數據庫操作,I/O,連接網絡或者別的有可能阻礙UI線程的操作)把它放入單獨的線程處理
                  3:儘量用Handler來處理UIthread和別的thread之間的交互


 六:UI線程
                  說了那麼多的UI線程,那麼哪些屬於UI線程呢?
                  UI線程主要包括如下:
                    Activity:onCreate(), onResume(), onDestroy(), onKeyDown(), 
                    onClick(),etc 
                    AsyncTask: onPreExecute(), onProgressUpdate(), 
                    onPostExecute(), onCancel,etc 
                    Mainthread handler: handleMessage(), post*(runnable r), etc 
                    other

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