編輯:關於Android編程
產生原因:由於主線程有很多重要事情要做,比如響應點擊事件等。如果在主線程裡做了太多耗時的操作,則有可能引發ANR。
如果你想模擬的話,比如在主線程裡讓主線程休眠6秒以上。Thread.sleep(6000);則會引發此狀況。所以在4.0以上版本,如果在主線程裡進行網絡訪問的操作,則會報錯。
避免:盡量將耗時的操作放在子線程裡。
產生原因:由於主線程有很多重要事情要做,比如響應點擊事件等。如果在主線程裡做了太多耗時的操作,則有可能引發ANR。
如果你想模擬的話,比如在主線程裡讓主線程休眠6秒以上。Thread.sleep(6000);則會引發此狀況。所以在4.0以上版本,如果在主線程裡進行網絡訪問的操作,則會報錯。
避免:盡量將耗時的操作放在子線程裡。
產生原因:由於主線程有很多重要事情要做,比如響應點擊事件等。如果在主線程裡做了太多耗時的操作,則有可能引發ANR。
如果你想模擬的話,比如在主線程裡讓主線程休眠6秒以上。Thread.sleep(6000);則會引發此狀況。所以在4.0以上版本,如果在主線程裡進行網絡訪問的操作,則會報錯。
避免:盡量將耗時的操作放在子線程裡。
產生原因:由於主線程有很多重要事情要做,比如響應點擊事件等。如果在主線程裡做了太多耗時的操作,則有可能引發ANR。
如果你想模擬的話,比如在主線程裡讓主線程休眠6秒以上。Thread.sleep(6000);則會引發此狀況。所以在4.0以上版本,如果在主線程裡進行網絡訪問的操作,則會報錯。
避免:盡量將耗時的操作放在子線程裡。
產生原因:由於主線程有很多重要事情要做,比如響應點擊事件等。如果在主線程裡做了太多耗時的操作,則有可能引發ANR。
如果你想模擬的話,比如在主線程裡讓主線程休眠6秒以上。Thread.sleep(6000);則會引發此狀況。所以在4.0以上版本,如果在主線程裡進行網絡訪問的操作,則會報錯。
避免:盡量將耗時的操作放在子線程裡。
在Android中,Activity Manager 和 Window Manager system services 會監控每個程序的運行,當程序出現如下三種種情況的時候就會彈出ANR的提示對話框: 1.用戶在進行了一種操作後5秒鐘沒有響應。 2.broadCastReceiver所進行的操作在10秒內沒有完成。 3.Service在20秒內沒返回結果。
在APP運行中,出現了ANR是非常讓人惱火的,會帶來非常差的用戶體驗。所以在設計Android應用程序的時候要盡可能的避免產生ANR。那麼如何才能避免ANR的產生呢?只要注意好以下三點,其實很簡單:
1.避免在主線程上進行復雜耗時的操作,比如說發送接收網絡數據/進行大量計算/操作數據庫/讀寫文件等。這個可以通過使用AsyncTask或者使用多線程來實現。
2.broadCastReceiver 要進行復雜操作的的時候,可以在onReceive()方法中啟動一個Service來處理 3.在設計及代碼編寫階段避免出現出現同步/死鎖或者錯誤處理不恰當等情況
ANR,是“ApplicationNotResponding”的縮寫,即“應用程序無響應”。系統會向用戶顯示一個對話框,用戶可以選擇“等待”而讓程序繼續運行,也可以選擇“強制關閉”。
在Android中,應用程序的響應是由ActivityManager和WindowManager系統服務監視的。當它監測到A、B、C情況中的一個時,Android就會針對特定的應用程序顯示ANR:
A.在5秒內沒有響應輸入的事件(例如,按鍵按下,屏幕觸摸)--主要類型
B.BroadcastReceiver在10秒內沒有執行完畢
C.Service在特定時間內(20秒內)無法處理完成--小概率類型
造成ABC的原因有很多,比如在主線程中做了非常耗時的操作,如下載,io異常等。還需要注意的是產生這種ANR的前提是要有輸入事件,如果用戶沒有觸發任何輸入事件,即便是主線程阻塞了,也不會產生ANR,因為InputDispatcher沒有分發事件給應用程序,當然也不會檢測處理超時和報告ANR了。
ANR發生時都會在log中輸出錯誤信息,從log中可以獲得ANR的類型,CPU的使用情況,CPU使用率過高有可能是CPU饑餓導致了ANR。CPU使用率過低說明主線程被block了,如果IOwait高是因為主線程進行I/O操作造成的。
除了log輸出外,你會發現各個應用進程和系統進程的函數堆棧信息都輸出到了一個/data/anr/traces.txt的文件中,這個文件是分析ANR原因的關鍵文件.要獲取到該文件可使用adb指令進行賦權後拉出查看調用stack。通過log、trace.text、代碼結合分析ANR的成因(iowait?Memoryleak?Block?)
要避免問題的產生,就要抓住問題產生的原因(ABC三種):
(1)避免在主線程上進行復雜耗時的操作,比如說發送接收網絡數據/進行大量計算/操作數據庫/讀寫文件等。這個可以通過使用AsyncTask或者使用多線程來實現。
(2)broadCastReceiver要進行復雜操作的的時候,可以在onReceive()方法中啟動一個Service來處理
(3)在設計及代碼編寫階段避免出現出現同步/死鎖或者錯誤處理不恰當等情況。
該文章只是簡單概括介紹ANR,具體的問題處理還是要在開發中去積累,萬變不離其宗掌握方法手到擒來。歡迎大牛指正交流。
本文實例講述了Android使用Eclipse 打開時“發現了以元素d:skin”開頭的無效內容。此處不應含有子元素的解決方法。分享給大家供大家參考,具體如下:今天打開
知識點:1.使用SQL Helper創建數據庫2.數據的增刪查改(PRDU:Put、Read、Delete、Update)背景知識:上篇文章學習了android保存文件,
很多應用為了節省空間而又使界面能夠充足的顯示信息,大多數應用都采用了側邊欄的方式,如下圖: 來說說它
Android生命周期估計連初學者都再熟悉不過的東西了,但這裡我拋出幾個問題,或許大家以前沒有想過或者可能認識的有些錯誤。 一、當A啟動B時,A和B生命周期方法執行的先後