Android ANR產生原因和解決辦法

2021-07-16 18:08:23 字數 1202 閱讀 1031

android anr產生原因和解決辦法

anr分類:

一般分為3種:

1:keydispatchtimeout(5 seconds) –主要情況 :按鍵或觸控事件在特定時間內無響應

2:broadcasttimeout(10 seconds)  :broadcastreceiver在特定時間內無法處理完成

3:servicetimeout(20 seconds) –小概率型別 : service在特定的時間內無法處理完成(所以雖然service是後台執行的,但是他是執行在ui執行緒的,如果處理一些耗時操作,會造成anr)

再細分的話anr可能是由主線程導致也可能是由非主線程導致:

由於主線程導致的情況:

1.耗時網路訪問

2.當有大量資料讀寫操作時再請求資料讀寫

3.資料庫操作(比如其他大資料量應用訪問資料庫導致資料庫負載過重時)

4.硬體操作(比如camera)

5.呼叫thread_join() / sleep() / wait() 或者等待locker的時候

6.service binder 數量達到上限

7.在system_server中發生watchdog anr

8.service忙導致超時無響應

由於非主線程導致的情況:

1.非主線程持有lock,導致主線程等待lock超時

2.非主線程終止或者崩潰導致主線程一直等待

避免anr:

1、主線程中,程式應該盡量少進行程式執行,activity應該在它的關鍵生命週期方法(如oncreate()和onresume())裡盡可能少的去做建立操作。(可以採用重新開啟子執行緒的方式,然後使用handler+message的方式做一些操作,比如更新主線程中的ui等)

2、應用程式應該避免在broadcastreceiver裡做耗時的操作或計算。但不要在子執行緒裡去做這些事情(因為 broadcastreceiver的生命周期短)。而應該讓應用程式應該啟動乙個 service。

3、避免在intent receiver裡啟動乙個activity,因為它會建立乙個新的畫面,並從當前使用者正在執行的程式上搶奪焦點。如果你的應用程式在響應intent廣 播時需要向使用者展示什麼,你應該使用notification manager來實現。

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