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