概述
ANR(Application Not Responding)是指應用無響應。
Android系統對於一些事件都在在一定時間內完成,如果超過預訂時間沒有得到相應就會在成ANR。
ANR機制是對應用程序主線程的限制,要求主線程在限定的時間內處理完一些最常見的操作(啓動服務、處理廣播、處理輸入), 如果處理超時,則認爲主線程已經失去了響應其他操作的能力。
場景
導致ANR的場景主要有以下:
- Service Timeout(20 seconds) —— Service在特定的時間內無法處理完成
- Broadcast Timeout(10 seconds) ——BroadcastReceiver在特定時間內無法處理完成
- ContentProvider Timeout——內容提供者執行超時
- KeyDispatch Timeout(5 seconds) ——主要類型按鍵或觸摸事件在特定時間內無響應
如何避免
將所有耗時操作,比如訪問網絡,Socket 通信,查詢大量SQL 語句,複雜邏輯計算等都放在子線程中去,然後通過handler.sendMessage、runonUITread、AsyncTask 等方式更新UI,以確保用戶界面操作的流暢度。
UI線程儘量只做跟UI相關的工作。
用Handler來處理UIThread和別的Thread之間的交互。