android ANR產生原因和解決的方法

2021-09-07 10:57:15 字數 1356 閱讀 9147

所以乙個流暢的合理的應用程式中不能出現anr,而讓使用者每次都要處理這個對話方塊。因此,在程式裡對響應效能的設計非常重要,這樣系統不會顯示anr給使用者。

預設情況下。在android中activity的最長執行時間是5秒,broadcastreceiver的最長執行時間則是10秒。

第一:什麼會引發anr?

在android裡。應用程式的響應性是由activity manager和windowmanager系統服務監視的 。當它監測到下面情況中的乙個時,android就會針對特定的應用程式顯示anr:

1.在5秒內沒有響應輸入的事件(比如。按鍵按下,螢幕觸控)

2.broadcastreceiver在10秒內沒有執行完成

潛在的耗時操作,比如網路或資料庫操作,或者高耗時的計算如改變位圖尺寸,應該在子執行緒裡(或者以資料庫操作為例,通過非同步請求的方式)來完畢。

然而,不是說你的主線程堵塞在那裡等待子執行緒的完畢——也不是呼叫 thread.wait()或是thread.sleep()。

替代的方法是,主線程應該為子執行緒提供乙個handler,以便完畢時可以提交給主線程。以這樣的方式設計你的應用程式。將能保證你的主線程保持對輸入的響應性並能避免因為5秒輸入事件的超時引發的anr對話方塊。

第二:怎樣避免anr?

1、執行在主線程裡的不論什麼方法都盡可能少做事情。

特別是,activity應該在它的關鍵生命週期方法(如oncreate()和onresume())裡盡可能少的去做建立操作。

(能夠採用又一次開啟子執行緒的方式。然後使用handler+message的方式做一些操作,比方更新主線程中的ui等)

2、應用程式應該避免在broadcastreceiver裡做耗時的操作或計算。但不再是在子執行緒裡做這些任務(由於 broadcastreceiver的生命周期短),替代的是,假設響應intent廣播須要執行乙個耗時的動作的話,應用程式應該啟動乙個 service。(此處須要注意的是能夠在廣播接受者中啟動service,可是卻不能夠在service中啟動broadcasereciver,關於原因興許會有介紹。此處不是本文重點)

3、避免在intent receiver裡啟動乙個activity。由於它會建立乙個新的畫面,並從當前使用者正在執行的程式上搶奪焦點。

假設你的應用程式在響應intent廣 播時須要向使用者展示什麼。你應該使用notification manager來實現。

總結:anr異常也是在程式中自己經常遇到的問題。基本的解決的方法自己最經常使用的就是不要在主線程中做耗時的操作,而應放在子執行緒中來實現,比方採用handler+mesage的方式,或者是有時候須要做一些和網路相互互動的耗時操作就採用asyntask非同步任務的方式(它的底層事實上handler+mesage有所差別的是它是執行緒池)等,在主線程中更新ui。

android ANR產生原因和解決辦法

預設情況下,在android中activity的最長執行時間是5秒,broadcastreceiver的最長執行時間則是10秒。第一 什麼會引發anr?在android裡,應用程式的響應性是由activity manager和windowmanager系統服務監視的 當它監測到以下情況中的乙個時,a...

android ANR產生原因和解決辦法

預設情況下,在android中activity的最長執行時間是5秒,broadcastreceiver的最長執行時間則是10秒。第一 什麼會引發anr?在android裡,應用程式的響應性是由activity manager和windowmanager系統服務監視的 當它監測到以下情況中的乙個時,a...

Android ANR產生原因和解決辦法

android anr產生原因和解決辦法 anr分類 一般分為3種 1 keydispatchtimeout 5 seconds 主要情況 按鍵或觸控事件在特定時間內無響應 2 broadcasttimeout 10 seconds broadcastreceiver在特定時間內無法處理完成 3 s...