2013-11-26 79 views
24

我在網上搜索了一下ANR是什麼。我也研究了這些參考文獻。但是我沒有得到關於Android崩潰的細節。ANR和Android崩潰有什麼區別?

有人能告訴我ANR(Android沒有響應)和Android崩潰之間的區別嗎?

回答

67

ANR代表 pplication Ñ OT ř esponding。

如果您在UI線程上運行需要很長時間(通常爲5秒左右)的進程,則會發生ANR。在此期間,GUI(圖形用戶界面)將被鎖定,這將導致用戶按下的任何內容都不會被執行。約5秒後,如果線程仍然沒有恢復,那麼會顯示一個ANR對話框,通知用戶應用程序沒有響應,並且會讓用戶選擇等待,希望應用程序將最終恢復,或強制關閉應用程序。

崩潰是當應用程序內的異常已被拋出尚未處理。例如,如果嘗試設置EditText組件的文本,但EditText爲null,並且沒有try catch語句來捕獲應用程序崩潰並強制關閉的異常。用戶不會看到什麼導致了崩潰,他們會顯示一個對話,告訴該應用程序已經意外強制關閉,並會給他們發送錯誤報告的選項。在這個例子中,如果你要查看bug報告,你會看到由java.lang.NullPointerException引起的錯誤。

希望這會有所幫助。

+1

如果您通過JNI運行C++代碼並在那裏發生錯誤,那麼應用程序進程只會在用戶沒有對話框的情況下崩潰。至少它曾經。 – juunas

12

ANR pplication Ñ OT ř esponding)是由於處理long running task in Main Thread(UI線程)。如果主線程停止時間超過5秒你ANR。

崩潰歸因於exception and error類似於Nullpoint,classNotfound,類型轉換,分析錯誤等。ANR也會導致應用程序崩潰。

注意:不要將運行在UI線程

參考ANR

+0

爲什麼崩潰發生的呢? – user3035740

+0

@ user3035740檢查ans現在 –

+0

是否可以在我的設備中查找ANR相關信息? – user3035740

0

ANR爲前長時間運行的任務:如果你是在UI線程下載龐大的數據量,如內存等不足MENY其他的可能性就會到來。 。可能它會導致android崩潰,我們不能說兩者都是一樣的其他

+0

所以崩潰是不同於ANR。 – user3035740

+0

是ANR不會在所有潛在客戶中崩潰.. – pavanmvn

+0

我在哪裏可以找到ANR相關信息? – user3035740

2

ANR表示應用程序不響應,這意味着您的應用程序不會在UI線程上註冊事件,因爲長時間運行的操作在那裏執行

1
ANR: It is called when anything your application is doing in the UI thread that 
takes a long time to complete (5 sec approx) 

參考:ANR

Crash: It is called when your Application gets some Error or Exception raised by the DVM 
1

ANR也5秒內引起副

  1. 於輸入事件無響應(如按鍵或觸摸屏事件)。
  2. BroadcastReceiver尚未在10秒內完成執行。
2

ANR代表應用程序沒有響應,並在長期操作發生到主線程發生了......

崩潰是由於異常和錯誤像Nullpoint,

1

應用無響應(ANR):

ANR將在下列條件下出現:

  • 在5秒內響應輸入事件(如按鍵或屏幕觸摸)

  • 廣播接收器尚未在10秒內完成執行。

如何避免ANR?

  • 創建長時間運行的操作,例如數據庫操作,網絡運營等

不同的工作線程強化響應速度: 在Android應用通常情況下,100〜200毫秒超出其用戶的門檻會覺得應用程序很慢。以下是我們可以通過其顯示應用程序更敏捷的提示。

  • 無論您何時做任何後臺工作並且用戶正在等待響應,都會顯示進度對話框。

  • 對於遊戲特別是在工作線程中進行移動計算。

  • 如果您的應用程序有耗時的初始設置,請顯示啓動畫面。

崩潰: 崩潰是未處理狀態到應用程序中,它會強行關閉我們的應用程序。一些崩潰的例子就像空指針異常,非法狀態異常等。

1

ANR代表應用程序沒有響應

這可能是由於許多原因造成的,例如應用程序阻塞UI線程上的某些I/O操作,因此係統無法處理傳入的用戶輸入事件。或者,應用程序可能花費太多時間來構建精細的內存結構或計算UI線程中的下一步。

阻止主線程不會導致崩潰,但會顯示一個彈出窗口讓用戶在5秒後終止應用程序。

但是對於崩潰,主要原因是人爲錯誤。 大部分時間的應用程序崩潰是因爲通過人類

人爲錯誤

缺乏測試

空指針異常的

出現OutofMemory

實施例製成的編碼/設計錯誤的:

這是常見的程序員會引用一個不存在的對象或變量,基本上會創建一個空指針錯誤。

如果您的連接不好,也可能導致應用程序崩潰。該應用程序也可能有內存管理問題。

請參閱我的回答,瞭解可能導致崩潰的Android特定異常類型。

Android Specific Exception

0

[ANR和崩潰不同] [1] Android應用程序通常在單個線程默認「UI線程」或 「主線程」完全運行。這意味着您的應用程序在UI線程中執行的任何操作都需要很長時間才能觸發ANR對話框,因爲您的應用程序沒有給自己處理輸入事件或意圖廣播的機會。

0

ANR:基本上是由於主線程上長時間運行的任務。

有一些常見的模式看診斷ANR數時:

  1. 該應用程序是做在主線程涉及I/O慢操作。
  2. 該應用程序正在對主線程進行長時間計算。
  3. 主線程正在對另一個進程執行同步聯編程序調用,而其他進程需要很長時間才能返回。
  4. 主線程被阻塞,等待正在另一個線程上發生的長操作的同步塊。
  5. 主線程與另一個線程處於死鎖狀態,無論是在您的進程中還是通過活頁夾調用。主線不僅僅是等待長時間的操作才能完成,而是處於死鎖狀態。

以下技術可以幫助您找出哪些原因導致您的ANR。

CRASH:

原因crashs可以有很多。有些原因是顯而易見的,比如檢查null值或空字符串,但其他人則比較含蓄,像傳遞無效參數的API,甚至複雜的多線程交互

2

ANR和崩潰的例子:

這個問題已經有一個被接受的答案,但我增加了兩個簡單的例子來更好地理解ANR和崩潰。

ANR:

// this will produce an ANR on your app 
int i = 0; 
while(true) { 
    i++; 
} 

崩潰:

// this will crash your app : will produce java.lang.ArithmeticException 
int value = 5, i = 0; 
int result = value/i; 
相關問題