2011-06-30 68 views
23

ANR是一個例外,錯誤還是什麼?我們能否真的在try{} catch(){}結構中捕捉它?「ANR」是一個異常還是錯誤?

+1

你忘了提及你所使用的平臺。 –

+0

尋找「I/Choreographer(xxx):跳過了xxx幀!應用程序可能在其主線程上做了太多工作。」在你的logcat中。這可能會幫助你找到你的問題。 – Christ

+0

看起來像是一個'什麼' – Kirby

回答

44

ANR(應用程序不響應)不完全是錯誤。當您的應用程序非常緩慢並需要大量時間來響應時纔會顯示,從而使用戶等待。如果您的應用程序讓他們等待很長時間,用戶將不會感激。所以,Android框架爲用戶提供了關閉應用程序的選項。 http://developer.android.com/guide/practices/design/responsiveness.html

當您在主線程上執行長時間運行操作時,會發生這種情況。由於主線程被阻塞,系統無法在此期間處理用戶交互。解決方案是在工作線程中執行繁重的操作,並保持主線程空閒。

2

無響應(ANR)對話框

你可以想像的應用,如果主線程忙於繁重的計算或從網絡套接字讀取 數據,也不能立即對用戶輸入,響應作爲 點擊或滑動。

對用戶交互沒有快速響應的應用程序會感覺到 無響應 - 任何超過幾百毫秒的延遲都會顯着地變爲 。這是一個非常有害的問題,Android平臺可以保護 用戶免受主線程上執行太多的應用程序的影響。

注意:

如果應用程序沒有對用戶輸入FVE秒內響應, 用戶將看到應用程序無響應(ANR)對話框, 將提供退出應用程序的選項。

下面的屏幕截圖顯示了一個典型的Android ANR對話框:

enter image description here

Android的努力工作,以同步的用戶界面與 硬件刷新率重繪。這意味着它的目標是以每秒 秒的60幀的速率重新繪製 - 這僅僅是每幀16.67毫秒。如果我們在接近16毫秒的任何地方使用 的主線程工作,我們就會影響幀速率,導致動畫效果不穩定,滾動等現象。

理想情況下,我們當然不想丟棄一個幀。 Jank,反應遲鈍, ,特別是ANR,提供了非常差的用戶體驗,這意味着不好的評論和不受歡迎的應用程序將被翻譯成 。建立Android 應用程序時遵循的規則是:不要阻塞主線程!

注意:

Android提供在每個設備上開發人員選項 一個有用的嚴格模式設置,這將FL屏幕上的灰時 主線程上執行長時間運行的操作應用。

進一步保護被添加到平臺蜂窩(API等級11)與 引入新的異常類,NetworkOnMainThreadException,如果系統檢測到網絡活動的主線程上啓動 時引發RuntimeException的一個子類 的。

來源:

異步編程的Android - 第二版 - 埃爾德洛斯 - 2016年7月

相關問題