android ANR異常及其解決方式

2021-08-27 00:26:20 字數 1303 閱讀 7280

anr定義

解決anr異常概述:

考慮上面的anr定義,讓我們來研究一下為什麼它會在android應用程式裡發生和如何最佳構建應用程式來避免anr。

android應用程式通常是執行在乙個單獨的執行緒(例如,main)裡。這意味著你的應用程式所做的事情如果在主線程裡占用了太長的時間的話,就會引發anr對話方塊,因為你的應用程式並沒有給自己機會來處理輸入事件或者intent廣播。

因此,執行在主線程裡的任何方法都盡可能少做事情。特別是,activity應該在它的關鍵生命週期方法(如oncreate()和onresume())裡盡可能少的去做建立操作。潛在的耗時操作,例如網路或資料庫操作,或者高耗時的計算如改變位圖尺寸,應該在子執行緒裡(或者以資料庫操作為例,通過非同步請求的方式)來完成。然而,不是說你的主線程阻塞在那裡等待子執行緒的完成——也不是呼叫thread.wait()或是thread.sleep()。替代的方法是,主線程應該為子執行緒提供乙個handler,以便完成時能夠提交給主線程。以這種方式設計你的應用程式,將能保證你的主線程保持對輸入的響應性並能避免由於5秒輸入事件的超時引發的anr對話方塊。這種做法應該在其它顯示ui的執行緒裡效仿,因為它們都受相同的超時影響。

引起anr異常的常見情況:

1、在主線程內進行網路操作,獲取伺服器上的資源

2、在主線程內進行一些緩慢的磁碟操作(

應用應該在5秒或者10秒內響應

一般來說,在應用程式裡,100到200ms是使用者能感知阻滯的時間閾值。因此,這裡有一些額外的技巧來避免anr,並有助於讓你的應用程式看起來有響應性。

如果你的應用程式為響應使用者輸入正在後台工作的話,可以顯示工作的進度(progressbar和progressdialog對這種情況來說很有用)。

通過handler解決anr異常:

方式一:

1.開啟乙個新的執行緒,進行資料請求,此執行緒內包含了比較耗時操作的**

2. 獲取資料後,呼叫handler.sendmessage方法

3. 在主線程中呼叫handlemessgae(message msg)方法接收資料並更新ui

方式二:

利用handler.post(new runnable()}

);

給建立handler物件的執行緒傳送乙個runnable,自動執行run方法

android ANR異常及其解決方式

anr定義 解決anr異常概述 考慮上面的anr定義,讓我們來研究一下為什麼它會在android應用程式裡發生和如何最佳構建應用程式來避免anr。android應用程式通常是執行在乙個單獨的執行緒 例如,main 裡。這意味著你的應用程式所做的事情如果在主線程裡占用了太長的時間的話,就會引發anr對...

android ANR異常及其解決方式

anr定義 解決anr異常概述 考慮上面的anr定義,讓我們來研究一下為什麼它會在android應用程式裡發生和如何最佳構建應用程式來避免anr。android應用程式通常是執行在乙個單獨的執行緒 例如,main 裡。這意味著你的應用程式所做的事情如果在主線程裡占用了太長的時間的話,就會引發anr對...

Android ANR異常及解決方法

在android裡,應用程式的響應性是由activity manager和windowmanager系統服務監視的 當它監測到以下情況中的乙個時,android就會針對特定的應用程式顯示anr 潛在的耗時操作,例如網路或資料庫操作,或者高耗時的計算如改變位圖尺寸,應該在子執行緒裡 或者以資料庫操作為...