ANR 定位和修正
可以通過查看/data/anr/traces.txt查看ANR信息。
根本原因是:主線程被卡了,導(dǎo)致應(yīng)用在5秒時(shí)間未響應(yīng)用戶的輸入事件。
很多種ANR錯(cuò)誤出現(xiàn)的場景:
1) 主線程當(dāng)中執(zhí)行IO/網(wǎng)絡(luò)操作,容易阻塞。
2) 主線程當(dāng)中執(zhí)行了耗時(shí)的計(jì)算。----自定義控件的時(shí)候onDraw方法里面經(jīng)常這么做。
(同時(shí)聊一聊自定義控件的性能優(yōu)化:在onDraw里面創(chuàng)建對(duì)象容易導(dǎo)致內(nèi)存抖動(dòng)---繪制動(dòng)作會(huì)大量不斷調(diào)用,產(chǎn)生大量垃圾對(duì)象導(dǎo)致GC很頻繁就造成了內(nèi)存抖動(dòng)。)內(nèi)存抖動(dòng)就容易造成UI出現(xiàn)掉幀卡頓的問題
3) BroadCastReceiver沒有在10秒內(nèi)完成處理。
4) BroadCastReceiver的onReceived代碼中也要盡量減少耗時(shí)的操作,建議使用IntentService處理。
5) Service執(zhí)行了耗時(shí)的操作,因?yàn)閟ervice也是在主線程當(dāng)中執(zhí)行的,所以耗時(shí)操作應(yīng)該在service里面開啟子線程來做。
6) 使用AsyncTask處理耗時(shí)的IO等操作。
7) 使用Thread或者HandlerThread時(shí),使用Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND)或者java.lang.Thread.setPriority(int priority)設(shè)置優(yōu)先級(jí)為后臺(tái)優(yōu)先級(jí),這樣可以讓其他的多線程并發(fā)消耗CPU的時(shí)間會(huì)減少,有利于主線程的處理。
8) Activity的onCreate和onResume回調(diào)中盡量耗時(shí)的操作。
總結(jié)
- 上一篇: 战神z7怎么进去启动盘 如何制作战神z7
- 下一篇: win7怎么用u盘还原 使用U盘还原Wi