主線程被 阻塞,導致應用在5秒時間未響應用戶
很多種ANR錯誤出現的場景:
1) 主線程當中執行IO/網絡操作,容易阻塞(Android4.0以後網絡IO不允許在主線程中)。
2) 主線程當中執行了耗時的計算。----自定義控件的時候onDraw方法裏面經常這麼做。(涉及自定義控件的性能優化:在onDraw裏面創建對象容易導致內存抖動—繪製動作會大量不斷調用,產生大量垃圾對象導致GC很頻繁就造成了內存抖動。)內存抖動就容易造成UI出現掉幀卡頓的問題
3) BroadCastReceiver沒有在10秒內完成處理。
4) BroadCastReceiver的onReceived代碼中也要儘量減少耗時的操作,建議使用IntentService處理。
5) Service執行了耗時的操作,因爲service也是在主線程當中執行的,所以耗時操作應該在service裏面開啓子線程來做。
6) 使用AsyncTask處理耗時的IO等操作。
7) 使用Thread或者HandlerThread時,使用Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND)或者java.lang.Thread.setPriority(int priority)設置優先級爲後臺優先級,這樣可以讓其他的多線程併發消耗CPU的時間會減少,有利於主線程的處理。
8) Activity的onCreate和onResume回調中儘量耗時的操作。