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