Android ANR異常及解決方法

2021-07-10 17:15:21 字數 1080 閱讀 4962

在android裡,應用程式的響應性是由activity manager和windowmanager系統服務監視的 。當它監測到以下情況中的乙個時,android就會針對特定的應用程式顯示anr:
潛在的耗時操作,例如網路或資料庫操作,或者高耗時的計算如改變位圖尺寸,應該在子執行緒裡(或者以資料庫操作為例,通過非同步請求的方式)來完成。然而,不是說你的主線程阻塞在那裡等待子執行緒的完成——也不是呼叫 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異常及解決方法

什麼是anr?為什麼會引發anr?如何避免anr?1 執行在主線程裡的任何方法都盡可能少做事情。特別是,activity應該在它的關鍵生命週期方法 如oncreate 和onresume 裡盡可能少的去做建立操作。可以採用重新開啟子執行緒的方式,然後使用handler message的方式做一些操作...

android ANR異常及其解決方式

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

android ANR異常及其解決方式

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