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

2021-08-21 05:21:54 字數 982 閱讀 7197

anr定義

anr發生條件

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

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

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

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

anr發生原因

那麼導致anr的根本原因是什麼呢?簡單的總結有以下兩點:

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

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

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

1.耗時的網路訪問

2.大量的資料讀寫

3.資料庫操作

4.硬體操作(比如camera)

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

6.service binder的數量達到上限

7.system server中發生watchdog anr

8.service忙導致超時無響應

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

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

如何避免anr發生

那麼如何避免anr的發生呢或者說anr的解決辦法是什麼呢?

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

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

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

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

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

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的...