什麼是ANR?網絡
Application Not Respondingoop
形成ANR的主要緣由:post
應用程序的響應性是由ActivityManager和WindowManager系統服務監視的,當監視到在Activity中主線程點擊超過5秒木有響應或者是在廣播UI線程裏超過10秒木有響應則會致使ANR。下面具體列舉一下:spa
- 主線程被I/O操做(從4.0以後網絡IO不容許在主線程中)阻塞。
- 主線程中存在耗時的計算。
形成ANR的主要緣由:Android中哪些操做是在主線程呢?線程
- Activity的全部生命週期回調都是執行在主線程的。
- Service默認就是執行在主線程的。
- BroadcastReceiver的onReceive回調是執行在主線程的。
- 沒有使用子線程的looper的Handler的handleMessage,post(Runnable)是執行在主線程的。
- AsyncTask的回調中除了doInBackground,其餘都是執行在主線程。
如何解決ANR:生命週期
- 使用Asynctask處理耗時IO操做。
- 使用Thread或者HandlerThread提升優先級。
- 使用Handler來處理工做線程的耗時任務。
- Activity的onCreate()和onResume()回調中儘可能避免耗時的代碼。