Android ANR發生的原因總結和解決辦法

2021-08-21 03:07:57 字數 970 閱讀 8115

首先anr的發生是有條件限制的,分為以下三點:

只有主線程才會產生anr,主線程就是ui執行緒;

必須發生某些輸入事件或特定操作,比如按鍵或觸屏等輸入事件,在broadcastreceiver或service的各個生命週期呼叫函式;

上述事件響應超時,不同的context規定的上限時間不同

a.主線程對輸入事件5秒內沒有處理完畢

b.主線程在執行broadcastreceiver的onreceive()函式時10秒內沒有處理完畢

c.主線程在前台service的各個生命週期函式時20秒內沒有處理完畢(後台service200s)。

1.主線程執行了耗時操作,比如資料庫操作或網路程式設計,i/o操作

2.其他程序(就是其他程式)占用cpu導致本程序得不到cpu時間片,比如其他程序的頻繁讀寫操作可能會導致這個問題。

細分的話,導致anr的原因有如下幾點:

耗時的網路訪問

大量的資料讀寫

資料庫操作

硬體操作(比如camera)

呼叫thread的join()方法、sleep()方法、wait()方法或者等待執行緒鎖的時候

service binder的數量達到上限

system server中發生watchdog anr

service忙導致超時無響應

其他執行緒持有鎖,導致主線程等待超時

其它執行緒終止或崩潰導致主線程一直等待

1.避免在主線程執行耗時操作,所有耗時操作應新開乙個子執行緒完成,然後再在主線程更新ui。

2.broadcastreceiver要執行耗時操作時應啟動乙個service,將耗時操作交給service來完成。

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

本文參考:

Android ANR發生的原因總結和解決辦法

anr定義 anr發生條件 首先anr的發生是有條件限制的,分為以下三點 1.只有主線程才會產生anr,主線程就是ui執行緒 2.必須發生某些輸入事件或特定操作,比如按鍵或觸屏等輸入事件,在broadcastreceiver或service的各個生命週期呼叫函式 3.上述事件響應超時,不同的cont...

android ANR發生的原因總結和解決辦法

1.只有主線程才會產生anr,主線程就是ui執行緒 2.必須發生某些輸入事件或特定操作,比如按鍵或觸屏等輸入事件,在broadcastreceiver或service的各個生命週期呼叫函式 3.上述事件響應超時,不同的context規定的上限時間不同 a.主線程對輸入事件5秒內沒有處理完畢 b.主線...

Android ANR產生的原因及定位分析

典型的anr問題場景 1 ui執行緒存在耗時操作,例如ui執行緒中存在網路請求 資料庫操作或者檔案操作等。android 4.0以後,如果在ui執行緒進行網路操作會直接報異常 2 ui執行緒等待子執行緒釋放某個鎖,從而無法處理使用者輸入 3 耗時的動畫需要大量的計算工作,導致cpu負載過重 anr的...