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

ANR的全稱是application not responding,是指應用程序未響應,Android系統對于一些事件需要在一定的時間范圍內完成,如果超過預定時間能未能得到有效響應或者響應時間過長,都會造成ANR。一般地,這時往往會彈出一個提示框,告知用戶當前xxx未響應,用戶可選擇繼續等待或者Force Close。

首先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來實現。

本文參考:http://www.lxweimin.com/p/7fd95bc2a55c

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容