關於ANR的解釋與避免方式

ANR的定義: android

在android上,若是你的應用程序有一段時間響應不移靈敏,系統會向用戶提示「應用程序無響應」(ANR:application Not Responding)對話框。所以,在程序裏對響應性能的設計很重要,這樣,系統不會顯示ANR給用戶。 數據庫

如何避免: 網絡

首先來研究下爲何它會在android的應用程序裏發生和如何最佳構建應用程序來避免ANR.
    android應用程序一般是運行在一個單獨的線程(例如:main)裏,這就意味你的應用程序所作的事情若是在主線程裏佔用了大長時間的話,就會引起ANR對話框,由於你的應用程序並無給本身機會來處理輸入事件或者Intent廣播。 app

    所以,運行在主線程裏的任何訪求都儘量少作事情。特別是,activity應該在它的關鍵生命週期方法(onCreate()和onResume())裏儘量少的去做建立操做。潛在的耗時操做,例如網絡或數據庫操做,或者高耗時的計算如改變位圖尺寸,應該在子線程裏(或者以數據庫操做爲例,經過異步請求的方式)來完成。然而,不是說你的主線程阻塞在那裏等待子線程的完成---也不是調用Thread.wait()或者Thread.sleep()。替代的方法是:主線程應該爲子線程提供一個Handler,以便完成時可以提交給主線程。以這種方式設計你的應用程序,將能保證你的主線程保持對輸入的響應性並能避免由5秒輸入事件的超時引起的ANR對話框。這種作法應該在其它顯示UI的線程裏效仿,由於它們都受相同的超時影響。 異步

    IntentReceiver執行時間的特殊限制意味着它應該作:在後臺裏作小的、瑣碎的工做,如保存設定或註冊一個Notification。和在主線程裏調用的其它方法同樣,應用程序應該避免在BroadcastReceiver裏作耗時的操做或計算,但也不是在子線程裏作這些任務(由於BroadcastReceiver的生命週期短),替代的是,若是響應Intent廣播須要執行一個耗時的動做的話,應用程序應該啓動一個Service。順便說起一句,你也應該避免在Intent Receiver裏啓動一個Activity,由於它會建立一個新的畫面,並從當前用戶正在運行的程序上搶奪焦點。若是你的應用程序在響應Intent廣播時須要向用戶展現什麼,你應該使用Notification Manager來實現。 性能

    通常來講,在應用程序裏,100到200ms是用戶能感知阻滯的時間閾值,下面總結了一些技巧來避免ANR,並有助於讓你的應用程序看起來有響應性。 spa

    若是你的應用程序爲響應用戶輸入正在後臺工做的話,能夠顯示工做的進度(ProgressBar和ProgressDialog對這種狀況來講頗有用)。特別是遊戲,在子線程裏作移動的計算。若是你的程序有一個耗時的初始化過程的話,考慮能夠顯示一個Splash Screen或者快速顯示主畫面並異步來填充這些信息。在這兩種狀況下,你都應該顯示正在進行的進度,以避免用戶認爲程序被凍結了。 線程

    固然我最經常使用的是用AsyncTask這個專用的異步處理類。 設計

相關文章
相關標籤/搜索