中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2020-08-07 21:50:20 來源:ITPUB博客 閱讀:130 作者:yilian 欄目:移動開發

前言?

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

一、前期基礎知識儲備

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

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

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

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

二、ANR定位方式及優化

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

$adb pull data/anr/traces.txt .

2.供選的優化ANR問題的方式:

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

2)如果你實現了Thread或者HandlerThread,請確保你的UI線程不會因為等待工作線程的某個任務而去執行Thread.wait()或者Thread.sleep()。UI線程不應該去等待工作線程完成某個任務,你的UI線程應該提供一個Handler給其他工作線程,這樣工作線程能夠通過這個Handler在任務結束的時候通知UI線程。例如:
繼承Thread類

實現Runnable接口

使用HandlerThread

3)開發在日常的開發過程中使用Thread或者HandlerThread,可以嘗試調用Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND)設置較低的優先級,否則仍然會降低程序響應,因為默認Thread的優先級和主線程相同。

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

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

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

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

1.Traceview - 系統性能分析工具,用于定位應用代碼中的耗時操作

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

①選好應用的進程,執行一段應用操作,從圖中的上半部分,可以看到各個線程的各個方法的執行時間;

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

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

該圖是具體的方法執行時間分布圖,我們重點關注其中的“Incl Real Time”這一時間指標,其為方法的實際調用時間,單位毫秒,查看時點擊Incl Real Time進行排列,方法會根據時間長短進行排列,其中超過500ms的方法我們都該重點關注。

2.Systrace - Android4.1新增的應用性能數據采樣和分析工具(與google引擎聯合開發 使用時借助chorme瀏覽器)

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

連接手機,進行一段操作,系統會生成一份Html文件,在谷歌瀏覽器中打開,如圖:

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

②點擊紅色圈的標注幀,可以看到Sytrace給出的Alert,具體查看可發現,給出了該幀具體的渲染時間為36.71ms,超過16.6ms,UI渲染時會發生掉幀的情況,即卡頓,再往下看,可以看到系統給出的建議和超時的主要方法。拿到這個方法再結合Traceview工具,進行具體分析,找到自己的代碼,進行優化,減少耗時。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

襄城县| 沂南县| 泽普县| 林西县| 舒城县| 双辽市| 久治县| 平阴县| 卓尼县| 滕州市| 高清| 南部县| 辽宁省| 门源| 江山市| 广汉市| 昌江| 宣化县| 广丰县| 永德县| 贺兰县| 迭部县| 德江县| 渝北区| 涟源市| 许昌县| 柳林县| 和田市| 邢台市| 南丹县| 钟祥市| 朝阳区| 新竹市| 革吉县| 泰和县| 遵化市| 松潘县| 锡林郭勒盟| 贡觉县| 九江县| 互助|