給你一個Demo看看這時你要怎么快速定位ANR?

前言?

我們程序員去面試的時候,做題必不可少。今天,就來給大家講解一下來自阿里巴巴的提問:給你一個Demo,你如何快速定位ANR

創(chuàng)新互聯(lián)建站是一家集網(wǎng)站建設(shè),威縣企業(yè)網(wǎng)站建設(shè),威縣品牌網(wǎng)站建設(shè),網(wǎng)站定制,威縣網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,威縣網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。

一、前期基礎(chǔ)知識儲備

1.ANR錯誤定義:在Android上,如果你的應(yīng)用程序有一段時間響應(yīng)不夠靈敏,系統(tǒng)會向用戶顯示一個對話框,這個對話框稱作“應(yīng)用程序無響應(yīng)”(ANR:Application Not Responding)對話框。用戶可以選擇“等待”而讓程序繼續(xù)運(yùn)行,也可以選擇“強(qiáng)制關(guān)閉”。因此,在程序里對響應(yīng)性能的設(shè)計很重要,這樣,系統(tǒng)不會顯示ANR給用戶。

默認(rèn)情況下,在Android中Activity的最長執(zhí)行時間是5秒(主要類型),BroadcastReceiver的最長執(zhí)行時間的則是10秒,ServiceTimeout的最長執(zhí)行時間是20秒(少數(shù)類型)。超出就會提示應(yīng)用程序無響應(yīng)(ANR錯誤)。

給你一個Demo  看看這時你要怎么快速定位ANR?
image

2.ANR錯誤出現(xiàn)原因:只有當(dāng)應(yīng)用程序的UI線程響應(yīng)超時才會引起ANR 超時產(chǎn)生的原因包括:①當(dāng)前事件沒有機(jī)會處理,例如UI線程正在響應(yīng)另外的事件,當(dāng)前事件被某個事件給阻塞掉了;②當(dāng)前事件正在處理 但是由于耗時太長沒有能及時的完成。其他原因:③在BroadcastReceiver里做耗時的操作或計算;④CPU使用過高;⑤發(fā)生了死鎖;⑥耗時操作的動畫需要大量的計算工作,可能導(dǎo)致CPU負(fù)載過重。

二、ANR定位方式及優(yōu)化

1.ANR錯誤定位——如果開發(fā)機(jī)器上出現(xiàn)ANR問題時,系統(tǒng)會生成一個traces.txt的文件放在/data/anr下,最新的ANR信息在最開始部分。通過adb命令將其導(dǎo)出到本地,輸入以下字符:

$adb pull data/anr/traces.txt .

2.供選的優(yōu)化ANR問題的方式:

1)為了執(zhí)行一個長時間的耗時操作而創(chuàng)建一個工作線程最方便高效的方式是使用AsyncTask,只需要繼承AsyncTask并實(shí)現(xiàn)doInBackground()方法來執(zhí)行任務(wù)即可。為了把任務(wù)執(zhí)行的進(jìn)度呈現(xiàn)給用戶,你可以執(zhí)行publishProgress()方法,這個方法會觸發(fā)onProgressUpdate()的回調(diào)方法。在onProgressUpdate()的回調(diào)方法中(它執(zhí)行在UI線程),你可以執(zhí)行通知用戶進(jìn)度的操作,例如:

2)如果你實(shí)現(xiàn)了Thread或者HandlerThread,請確保你的UI線程不會因?yàn)榈却ぷ骶€程的某個任務(wù)而去執(zhí)行Thread.wait()或者Thread.sleep()。UI線程不應(yīng)該去等待工作線程完成某個任務(wù),你的UI線程應(yīng)該提供一個Handler給其他工作線程,這樣工作線程能夠通過這個Handler在任務(wù)結(jié)束的時候通知UI線程。例如:
繼承Thread類

實(shí)現(xiàn)Runnable接口

使用HandlerThread

3)開發(fā)在日常的開發(fā)過程中使用Thread或者HandlerThread,可以嘗試調(diào)用Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND)設(shè)置較低的優(yōu)先級,否則仍然會降低程序響應(yīng),因?yàn)槟J(rèn)Thread的優(yōu)先級和主線程相同。

4)Activity的onCreate和onResume回調(diào)中盡量避免耗時的代碼,應(yīng)該盡可能的做比較少的事情,其實(shí),任何執(zhí)行在UI線程中的方法都應(yīng)該盡可能簡短快速。類似網(wǎng)絡(luò)或者DB操作等可能長時間執(zhí)行的操作,或者是類似調(diào)整bitmap大小等需要長時間計算的操作,都應(yīng)該執(zhí)行在工作線程中。

5)BroadcastReceiver中onReceive代碼也要盡量減少耗時。如果必須在onReceive方法中執(zhí)行耗時操作,建議使用IntentService進(jìn)行處理,IntentService集開啟線程和自動關(guān)閉服務(wù)兩種功能于一身,本身非常靈活。

6)增加界面響應(yīng)性(交互層面),這是一個成熟應(yīng)用必備的標(biāo)志—通常來說,100ms - 200ms是用戶能夠察覺到卡頓的上限。如果你的程序在啟動階段有一個耗時的初始化操作,可以考慮顯示一個閃屏,要么盡快的顯示主界面,然后馬上顯示一個加載的對話框,異步加載數(shù)據(jù)。無論哪種情況,你都應(yīng)該顯示一個進(jìn)度信息,以免用戶感覺程序有卡頓的情況。

三、輔助處理ANR問題的工具

1.Traceview - 系統(tǒng)性能分析工具,用于定位應(yīng)用代碼中的耗時操作

給你一個Demo  看看這時你要怎么快速定位ANR?
image

①選好應(yīng)用的進(jìn)程,執(zhí)行一段應(yīng)用操作,從圖中的上半部分,可以看到各個線程的各個方法的執(zhí)行時間;

②從圖中的下半部分,可以該段操作中具體調(diào)用的方法和每個方法的執(zhí)行時間、執(zhí)行次數(shù)。占CPU的百分比;

給你一個Demo  看看這時你要怎么快速定位ANR?
image

該圖是具體的方法執(zhí)行時間分布圖,我們重點(diǎn)關(guān)注其中的“Incl Real Time”這一時間指標(biāo),其為方法的實(shí)際調(diào)用時間,單位毫秒,查看時點(diǎn)擊Incl Real Time進(jìn)行排列,方法會根據(jù)時間長短進(jìn)行排列,其中超過500ms的方法我們都該重點(diǎn)關(guān)注。

2.Systrace - Android4.1新增的應(yīng)用性能數(shù)據(jù)采樣和分析工具(與google引擎聯(lián)合開發(fā) 使用時借助chorme瀏覽器)

給你一個Demo  看看這時你要怎么快速定位ANR?
image

連接手機(jī),進(jìn)行一段操作,系統(tǒng)會生成一份Html文件,在谷歌瀏覽器中打開,如圖:

①Sytrace會顯示在這段操作期間所有的進(jìn)程信息,在其中找到自己的進(jìn)程,可以看到在測試進(jìn)程中,我們定位UI Thread,可以看到里面的系統(tǒng)方法,這是UI渲染時的調(diào)用方法,上面有一個個的圈,綠色圈代表幀渲染時間是16.6ms(Android系統(tǒng)渲染UI界面時間為1秒60幀,每幀即16.6ms),超過該值的幀用紅色圈標(biāo)注;

②點(diǎn)擊紅色圈的標(biāo)注幀,可以看到Sytrace給出的Alert,具體查看可發(fā)現(xiàn),給出了該幀具體的渲染時間為36.71ms,超過16.6ms,UI渲染時會發(fā)生掉幀的情況,即卡頓,再往下看,可以看到系統(tǒng)給出的建議和超時的主要方法。拿到這個方法再結(jié)合Traceview工具,進(jìn)行具體分析,找到自己的代碼,進(jìn)行優(yōu)化,減少耗時。

當(dāng)前題目:給你一個Demo看看這時你要怎么快速定位ANR?
URL鏈接:http://muchs.cn/article32/ihjpsc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站網(wǎng)站改版、小程序開發(fā)靜態(tài)網(wǎng)站、網(wǎng)站內(nèi)鏈、網(wǎng)站收錄

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運(yùn)營