android ANR發(fā)生的原因總結(jié)和解決辦法

ANR的全稱是application not responding,意思就是程序未響應,類似于我們在windows上見到的程序未響應。ANR發(fā)生會使用戶覺得我們的程序不友好,那么什么情況會導致ANR的發(fā)生呢?

首先ANR的發(fā)生是有條件限制的,分為以下三點:

1.只有主線程才會產(chǎn)生ANR,主線程就是UI線程;

2.必須發(fā)生某些輸入事件或特定操作,比如按鍵或觸屏等輸入事件,在BroadcastReceiver或Service的各個生命周期調(diào)用函數(shù);

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

? ? a.主線程對輸入事件5秒內(nèi)沒有處理完畢

? ? b.主線程在執(zhí)行BroadcastReceiver的onReceive()函數(shù)時10秒內(nèi)沒有處理完畢

? ? c.主線程在Service的各個生命周期函數(shù)時20秒內(nèi)沒有處理完畢。

那么導致ANR的根本原因是什么呢?簡單的總結(jié)有以下兩點:

1.主線程執(zhí)行了耗時操作,比如數(shù)據(jù)庫操作或網(wǎng)絡(luò)編程

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

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

1.耗時的網(wǎng)絡(luò)訪問

2.大量的數(shù)據(jù)讀寫

3.數(shù)據(jù)庫操作

4.硬件操作(比如camera)

5.調(diào)用thread的join()方法、sleep()方法、wait()方法或者等待線程鎖的時候

6.service binder的數(shù)量達到上限

7.system server中發(fā)生WatchDog ANR

8.service忙導致超時無響應

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

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

那么如何避免ANR的發(fā)生呢或者說ANR的解決辦法是什么呢?

1.避免在主線程執(zhí)行耗時操作,所有耗時操作應新開一個子線程完成,然后再在主線程更新UI。

2.BroadcastReceiver要執(zhí)行耗時操作時應啟動一個service,將耗時操作交給service來完成。

3.避免在Intent Receiver里啟動一個Activity,因為它會創(chuàng)建一個新的畫面,并從當前用戶正在運行的程序上搶奪焦點。如果你的應用程序在響應Intent廣 播時需要向用戶展示什么,你應該使用Notification Manager來實現(xiàn)。

That's all.

參考:

http://www.cnblogs.com/mobile-veterans/archive/2012/07/20/2600715.html

http://blog.sina.com.cn/s/blog_618199e60101kvbl.html

http://wenku.baidu.com/link?url=kwhbIuXYJsE6Pw5rBLNQA2U9wSduSMYQBIF5-Oidds2X0FLJs2w_EX-iPvBQ4oXVjhGqYq5xbS1n6QModiw_7KHAoEFyDlAil_eKV3_bUaa

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

推薦閱讀更多精彩內(nèi)容