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