一:什么是ANR
如果應(yīng)用程序不能響應(yīng)用戶的輸入了,那么就可以說(shuō)應(yīng)用ANR了。
如果需要運(yùn)行一個(gè)耗時(shí)較長(zhǎng)的操作的時(shí)候,不要把這個(gè)任務(wù)放在UI線程上運(yùn)行,而是單獨(dú)創(chuàng)建一個(gè)線程運(yùn)行那些操作。
以下情況會(huì)出現(xiàn)ANR提示對(duì)話框:
5秒內(nèi)對(duì)一個(gè)輸入動(dòng)作沒(méi)有反應(yīng)。
一個(gè)BroadcastReceiver在10秒內(nèi)沒(méi)有完成運(yùn)行。
二:如何避免ANR
在activity的關(guān)鍵的生命周期方法: onCreate 和 onResume方法上盡可能處理越少越好的事情。
下面列舉的操作都是長(zhǎng)時(shí)間運(yùn)行的:網(wǎng)絡(luò)工作、數(shù)據(jù)庫(kù)操作、精確的計(jì)算,例如重新定制圖片(應(yīng)該在單獨(dú)的工作線程中)、或者通過(guò)異步請(qǐng)求操作數(shù)據(jù)庫(kù)的情況下。
最有效的創(chuàng)建一個(gè)工作線程來(lái)執(zhí)行長(zhǎng)時(shí)間操作的是Asynctask類。如果你非要自己創(chuàng)建一個(gè)自己的Thread或者HandlerThread類,你應(yīng)該設(shè)置這個(gè)類的屬性為"background",通過(guò)調(diào)用Process.setThreadPriority() ,填上THREAD_PRIORITY_BACKGROUND參數(shù)。如果你不設(shè)置低優(yōu)先級(jí),那么你的線程仍然有可能減慢你的應(yīng)用,因?yàn)樗J(rèn)運(yùn)行的優(yōu)先級(jí)和你的UI線程的優(yōu)先級(jí)一樣。當(dāng)你實(shí)現(xiàn)Thread或HandlerThread方法的時(shí)候,確定你的UI線程不會(huì)在等待工作線程結(jié)束的過(guò)程中被阻塞,不要調(diào)用Thread.wait()或者 Thread.sleep()。你的應(yīng)用主線程不應(yīng)該因?yàn)榈却泳€程完成而阻塞,而是應(yīng)該提供一個(gè)Handler去接受其他線程完成后的結(jié)果。這樣設(shè)計(jì)你的應(yīng)用可以保證你的應(yīng)用仍然能夠響應(yīng)用戶的輸入,避免ANR。
接受BroadcastReciver的執(zhí)行時(shí)間,約束它的執(zhí)行時(shí)間,主要進(jìn)行的操作是保存設(shè)置或者注冊(cè)一個(gè)通知,這樣的話,才能夠避免當(dāng)其他方法調(diào)用UI線程的時(shí)候,應(yīng)用程序在執(zhí)行長(zhǎng)耗時(shí)的方法。
如果非要在接收Broadcast后執(zhí)行長(zhǎng)時(shí)間的操作,可以啟動(dòng)一個(gè)IntentService來(lái)執(zhí)行。
-
anr
+關(guān)注
關(guān)注
0文章
3瀏覽量
2136
原文標(biāo)題:Android開(kāi)發(fā)之如何避免ANR(Keeping Your App Responsive)
文章出處:【微信號(hào):Imgtec,微信公眾號(hào):Imagination Tech】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論