標籤:時間片 輸出 應用程式 handle art 是什麼 java binder creat
一、 什麼是北京×××搭建 dsluntan.com VX:17061863513ANR
ANR,(Application Not Responding) 即應用程式無響應,在android應用中,當我們的UI線程被阻塞,就會彈出如下對話方塊,使用者可以選擇繼續等待或者關閉這個應用程式,這種現象我們稱之為ANR.
二、 ANR的類型
ANR的類型大致分為以下三種
1、主線程對輸入事件在5秒內沒有處理完畢 產生這種ANR的前提是要有輸入事件,如果使用者沒有觸發任何輸入事件,即便是主線程阻塞了,也不會產生ANR,因為InputDispatcher沒有分發事件給應用程式,當然也不會檢測處理逾時和報告ANR了。
2、主線程在執行BroadcastReceiver的onReceive函數時10秒內沒有執行完畢,後台進程是60秒 這種情況的ANR系統不會顯示對話方塊提示,僅是輸出log而已。
3、主線程在執行Service的各個生命週期函數時20秒內沒有執行完畢,後台進程為200秒
同樣對這種情況的ANR系統也不會顯示對話方塊提示,僅是輸出log。
三種類型的ANR只有第一種會有彈框。
Type
Method call
Log sample
time out
Input dispatch
onClick(),onTouch(),onKeydown(),onKeyup()
Input dispatching timed out
5
Broadcast
onReceive()
Timeout of broadcast
FG: 10, BG 60
Service
onBind(),onCreate(),onStartCommand(),onUnbind(),onDestroy()
Timeout executing service
FG: 20, BG 200
三、 ANR產生的原因
大致分為兩類:
1.應用自身進程引起的問題,比如, 在oncreate ,onstart等生命週期中執行耗時操作,ui線程阻塞,掛起,死迴圈等
2,其他進程引起的,比如:io操作導致cpu使用過高,導致當前應用進程無法搶佔到cpu時間片
細分的話可以分為以下一些情況:
耗時的網路訪問
大量的資料讀寫
資料庫操作
硬體操作(比如camera)
調用thread的join()方法、sleep()方法、wait()方法或者等待線程鎖的時候
service binder的數量達到上限
system server中發生WatchDog ANR
service忙導致逾時無響應
其他線程持有鎖,導致主線程等待逾時
其它線程終止或崩潰導致主線程一直等待...
四、如何避免ANR
耗時的工作()比如資料庫操作,I/O,網路操作),採用單獨的背景工作執行緒處理
用Handler來處理UIthread和工作thread的互動
合理使用 Handler 來處理其他線程請求;
合理使用並遵循 Android 生命週期, 避免在 onCreate() and onResume() 做過多的事情;
使用一些架構形成規範來避免記憶體等問題,例如:MVP、RxJava;
經常使用工具來檢查記憶體問題,例如:MAT、TraceView、AS 內建等工具;
避免載入大圖片引起記憶體不足導致 ANR;
避免記憶體泄露引起的 ANR。
Android ANR分析實踐(一):北京×××搭建ANR是什麼、產生的原因及如何避免ANR