異常——ANR

什么是ANR異常

ANR即Application Not Responding程序無響應(yīng)介牙,主要有以下三種情況會(huì)報(bào)ANR異常:

1壮虫、Activity的響應(yīng)時(shí)間超過5s;

2环础、BroadcastReceiver執(zhí)行時(shí)間超過10s囚似;

3剩拢、Service執(zhí)行時(shí)間超過20s;

造成ANR的原因

1谆构、在主線程中執(zhí)行了耗時(shí)操作裸扶,比如網(wǎng)絡(luò)讀取圖片數(shù)據(jù)并進(jìn)行圖片轉(zhuǎn)換框都;

2搬素、在主線程中進(jìn)行IO讀寫、磁盤讀寫魏保、數(shù)據(jù)庫讀寫等操作熬尺;

3、在主線程中大量創(chuàng)建新對象谓罗;

Android中執(zhí)行在主線程的操作

1粱哼、Activity的所有生命周期回調(diào)方法;

2檩咱、Service默認(rèn)是執(zhí)行在主線程的揭措;

3、BroadcastReceiver的onReceiver()回調(diào)方法刻蚯;

4绊含、沒有使用子線程的looper的Handler的handlerMessage()方法,post(Runnable r)方法;

5、AsyncTask除了doInBackground()方法之外其它的方法都是執(zhí)行在主線程中骏掀;

如何避免ARN

1噪舀、在UI線程中不要進(jìn)行耗時(shí)操作;比如在Activity的onCreate()或者onResume()生命周期中不要做耗時(shí)操作音羞;

2、創(chuàng)建子線程來執(zhí)行耗時(shí)操作;

3伴找、盡量使用Handler來處理主線程和子線程之間的交互;

4废菱、可以使用AsyncTask來執(zhí)行異步任務(wù)并及時(shí)更新UI技矮;

如何排查ANR

1、查看報(bào)錯(cuò)的Log日志文件昙啄;具體可查看ANR的類型穆役,CPU的使用情況等信息,并不能進(jìn)行準(zhǔn)確定位梳凛;

2耿币、分析traces.txt文件;如果發(fā)生ANR異常韧拒,系統(tǒng)會(huì)在/data/anr/目錄下生成traces.txt文件淹接,可以通過分析traces.txt文件來查看產(chǎn)生ANR的原因十性,但前提是手機(jī)需要Root獲取相應(yīng)的權(quán)限;

3塑悼、使用BlockCanary第三方監(jiān)控組件劲适,BlockCanary可以對主線程進(jìn)行完全透明的監(jiān)控,而且如果遇到UI卡頓時(shí)能精確輸出信息定位到問題所在厢蒜,不需要像Logcat一樣霞势,慢慢去找。

BlockCanary的工作原理:

主要利用了主線程中的消息處理機(jī)制斑鸦,在主線程中ActivityThread會(huì)默認(rèn)創(chuàng)建一個(gè)Looper愕贡,而Looper會(huì)調(diào)用loop()方法不斷從消息隊(duì)列MessageQueue取出消息,然后通過dispatchMessage()方法進(jìn)行消息的處理巷屿,通過ActivityThread的源碼可以發(fā)現(xiàn)在dispatchMessage()方法的前后都有l(wèi)og輸出事件固以,而dispatchMessage()是一次消息的處理過程,我們就可以計(jì)算從消息處理開始到消息處理結(jié)束的時(shí)間嘱巾,如果這個(gè)時(shí)間超過了16ms的話憨琳,那么就可以認(rèn)定是發(fā)生了UI卡頓現(xiàn)象,進(jìn)而輸出異常日志信息旬昭。

BlockCanary輸出的信息:

(1)基本信息:安裝包標(biāo)示篙螟、機(jī)型、api等級稳懒、uid闲擦、CPU內(nèi)核數(shù)、進(jìn)程名场梆、內(nèi)存墅冷、版本號等;

(2)耗時(shí)信息:實(shí)際耗時(shí)或油、主線程時(shí)鐘耗時(shí)寞忿、卡頓開始時(shí)間和結(jié)束時(shí)間;

(3)CPU信息:時(shí)間段內(nèi)CPU是否忙顶岸,時(shí)間段內(nèi)的系統(tǒng)CPU/應(yīng)用CPU占比腔彰,I/O占CPU使用率;

(4)堆棧信息:發(fā)生卡慢前的最近堆棧辖佣,可以用來幫助定位卡慢發(fā)生的地方和重現(xiàn)路徑霹抛;


推薦閱讀:

BlockCanary — 輕松找出Android App界面卡頓元兇

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市卷谈,隨后出現(xiàn)的幾起案子杯拐,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件端逼,死亡現(xiàn)場離奇詭異朗兵,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)顶滩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門余掖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人礁鲁,你說我怎么就攤上這事盐欺。” “怎么了救氯?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵找田,是天一觀的道長歌憨。 經(jīng)常有香客問我着憨,道長,這世上最難降的妖魔是什么务嫡? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任甲抖,我火速辦了婚禮,結(jié)果婚禮上心铃,老公的妹妹穿的比我還像新娘准谚。我一直安慰自己,他們只是感情好去扣,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布柱衔。 她就那樣靜靜地躺著,像睡著了一般愉棱。 火紅的嫁衣襯著肌膚如雪唆铐。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天奔滑,我揣著相機(jī)與錄音艾岂,去河邊找鬼。 笑死朋其,一個(gè)胖子當(dāng)著我的面吹牛王浴,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播梅猿,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼氓辣,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了袱蚓?” 一聲冷哼從身側(cè)響起钞啸,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后爽撒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體入蛆,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年硕勿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了哨毁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,039評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡源武,死狀恐怖扼褪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情粱栖,我是刑警寧澤话浇,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站闹究,受9級特大地震影響幔崖,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜渣淤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一赏寇、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧价认,春花似錦嗅定、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至脐彩,卻和暖如春碎乃,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背丁屎。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工荠锭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人晨川。 一個(gè)月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓证九,卻偏偏與公主長得像,于是被迫代替她去往敵國和親共虑。 傳聞我的和親對象是個(gè)殘疾皇子愧怜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評論 2 345

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