ANR的出現(xiàn)和解決

1.什么是ANR

在Android上浪读,如果你的應用程序有一段時間響應不夠靈敏筋栋,系統(tǒng)會向用戶顯示一個對話框胆建,這個對話框稱作應用程序無響應(ANR:Application Not Responding)對話框甥啄。用戶可以選擇讓程序繼續(xù)運行活尊,但是灰粮,他們在使用你的應用程序時仔涩,并不希望每次都要處理這個對話框。因此粘舟,在程序里對響應性能的設計很重要熔脂,這樣,系統(tǒng)不會顯示ANR給用戶柑肴。

2.ANR產(chǎn)生的原因

ANR產(chǎn)生的根本原因是APP阻塞了UI線程霞揉。在android系統(tǒng)中每個App只有一個UI線程,是在App創(chuàng)建時默認生成的晰骑,UI線程默認初始化了一個消息循環(huán)Looper來處理UI消息适秩,ANR往往就是處理UI消息超時了。那么UI消息來源有哪些呢些侍?主要有兩種來源:

? 2.1 來自于AMS的回調(diào)消息

? ? ? ? ?在Android系統(tǒng)中隶症,應用程序是有Android的四大組件組成,AMS負責對應用程序四大組件生? ? ?命? 周期的管理岗宣,當AMS對應用程序組件的生命周期進行回調(diào)超過AMS定義的響應時間時蚂会,AMS 就會報ANR。出現(xiàn)這種情況耗式,一般是因為在這些組件的回調(diào)函數(shù)里面進行了耗時操作(如網(wǎng)絡 操作胁住、SD卡文件操作、數(shù)據(jù)庫操作刊咳、大量計算等)彪见,AMS對組件常見的回調(diào)函數(shù)及超時時間

如下:

Activity: onCreate(), onResume(), onDestroy(),? onKeyDown(), onClick()等,超時時間5s Application: onCreate(), onTerminate()等娱挨,超時時間5s Service: onCreate(), onStart(), onDestroy()等余指,超時時間20s BroadcastReceiver:onReceiver(),前臺APP廣播超時時間是10s跷坝,后臺App是60s

2.2 App自己的發(fā)出的消息

除了AMS對四大組件的回調(diào)消息運行在UI線程外酵镜,有些操作也是運行在UI線程的:

AsyncTask: onPreExecute(), onProgressUpdate(), onPostExecute(), onCancel()等,超時5sMainthreadhandler: handleMessage(), post*(runnable r)等柴钻,超時5s

3.怎樣避免ANR

當我們知道ANR的產(chǎn)生原因之后淮韭,就可以較為輕松的避免ANR了。并且Android為我們提供了很多解決方法贴届。主要歸為一下幾類靠粪。

1:UI線程盡量只做跟UI相關(guān)的工作蜡吧,但一些復雜的UI操作,還是需要一些技巧來處理占键,不如你讓一個Button去setText一個10M的文本昔善,UI肯定崩掉了,不過對于此類問題捞慌,分段加載貌似是最好的方法了耀鸦。

2:讓耗時的工作(比如數(shù)據(jù)庫操作,I/O啸澡,連接網(wǎng)絡或者別的有可能阻礙UI線程的操作)把它放入單獨的線程處理袖订。

3:盡量用Handler來處理UIthread和別的thread之間的交互。

4.發(fā)布的程序怎樣收集ANR異常

? 對于發(fā)布的程序嗅虏,ANR異常是很那捕獲不到的(我查找過很多資料洛姑,如果您有很好的捕獲辦法,歡迎再下方留言)皮服,所以我們需要采用其它的方法來分析ANR楞艾。app在產(chǎn)生ANR異常后,會將異常信息寫入"/data/anr/traces.txt"文件我們可以通過收集用戶的這個文件龄广,就可以來獲取用戶產(chǎn)生ANR的地方了硫眯。

我在一個按鈕的onClick事件里寫了如下代碼

while(true){}

來故意產(chǎn)生一個ANR異常,然后打開/data/anr/traces.tx文件择同,主要有用的地方如下圖:

我們可以看到两入,在trace.txt文件里已經(jīng)定位到異常產(chǎn)生的地方。所以敲才,在用戶反饋界面裹纳,當我們發(fā)現(xiàn)戶反饋內(nèi)容里是否出現(xiàn)了"無響應"等字眼的時候,就可以提示用戶是否上傳異常文件紧武,來幫助我們改善產(chǎn)品之類的剃氧。當然,現(xiàn)在流氓猖狂阻星,貌似做到這么細致產(chǎn)品的朋鞍,為數(shù)不多了。

ANR屬于慢性崩潰妥箕,Android應用里的還存在著很多的強制崩潰滥酥,別如你執(zhí)行了3/0了,空指針異常了等等矾踱,這些情況應用程序會直接崩掉,用戶體驗超級差疏哗。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末呛讲,一起剝皮案震驚了整個濱河市禾怠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌贝搁,老刑警劉巖吗氏,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異雷逆,居然都是意外死亡弦讽,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門膀哲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來往产,“玉大人,你說我怎么就攤上這事某宪》麓澹” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵兴喂,是天一觀的道長蔼囊。 經(jīng)常有香客問我,道長衣迷,這世上最難降的妖魔是什么畏鼓? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮壶谒,結(jié)果婚禮上云矫,老公的妹妹穿的比我還像新娘。我一直安慰自己佃迄,他們只是感情好泼差,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著呵俏,像睡著了一般堆缘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上普碎,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天吼肥,我揣著相機與錄音,去河邊找鬼麻车。 笑死缀皱,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的动猬。 我是一名探鬼主播何缓,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼娘锁!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起免钻,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎崔拥,沒想到半個月后极舔,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡链瓦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年拆魏,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片慈俯。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡渤刃,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出肥卡,到底是詐尸還是另有隱情溪掀,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布步鉴,位于F島的核電站揪胃,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏氛琢。R本人自食惡果不足惜喊递,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望阳似。 院中可真熱鬧骚勘,春花似錦、人聲如沸撮奏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽畜吊。三九已至泽疆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間玲献,已是汗流浹背殉疼。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留捌年,地道東北人瓢娜。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像礼预,于是被迫代替她去往敵國和親眠砾。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354

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