ANR原因及預防

2021-09-08 07:38:25 字數 1033 閱讀 9778

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

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

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

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

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

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

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

那麼導致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的解決辦法是什麼呢?

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

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

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

避免出現anr的方法 ANR的產生原因及避免辦法

在android上,如果你的應用程式有 responding 對話方塊。使用者可以選擇讓程式繼續執行,但是,他們在使用你的應用程式時,並不希望每次都要處理這個對話方塊。因此,在程式裡對響應性 能的設計很重要,這樣,系統不會顯示anr給使用者。如何來避免 考慮上面的anr定義,讓我們來研究一下為什麼它...

ANR和Force close產生和原因

一 概念 anr,程式沒有響應,有可能程式會再次響應 例子 應用執行時,main執行緒進行了耗時操作應用執行時,使用者操作過於頻繁 force close 程式丟擲異常,會強制退出 例子 應用執行時丟擲了outofmemoryerror,應用執行時丟擲了runtimeexception 二 出現場景...

通用閥件常見故障原因及預防

1.設計不良,如安全係數過小,結構不合理,內應力太集中。設計應符合國家標準和有關規範,結構應合理,避免內應力過於集中。新產品經過實地考驗後,方可成批生產。2.鍛造和鑄造質量差,有摺疊 冷隔 氣孔夾渣 鬆散組織 隱裂紋等缺陷以及摩簿不勻,材質不勻,材質不符設計要求等現象。嚴格遵守操作規程和工藝紀律,按...