}
};
public static LogMonitor getInstance() {
return sInstance;
}
public boolean isMonitor() {
return mIoHandler.hasCallbacks(mLogRunnable);
}
public void startMonitor() {
mIoHandler.postDelayed(mLogRunnable, TIME_BLOCK);
}
public void removeMonitor() {
mIoHandler.removeCallbacks(mLogRunnable);
}
}
我們利用了HandlerThread這個類,同樣利用了Looper機制,只不過在非UI線程中,如果執(zhí)行耗時達到我們設(shè)置的閾值,則會執(zhí)行mLogRunnable
,打印出UI線程當(dāng)前的堆棧信息;如果你閾值時間之內(nèi)完成,則會remove掉該runnable。
(2)測試
用法很簡單,在Application的onCreate中調(diào)用:
BlockDetectByPrinter.start();
即可。
然后我們在Activity里面,點擊一個按鈕,讓睡眠2s,測試下:
findViewById(R.id.id_btn02)
.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
}
}
});
運行點擊時,會打印出log:
02-21 00:26:26.408 2999-3014/com.zhy.testlp E/TAG:
java.lang.VMThread.sleep(Native Method)
java.lang.Thread.sleep(Thread.java:1013)
java.lang.Thread.sleep(Thread.java:995)
com.zhy.testlp.MainActivity$2.onClick(MainActivity.java:70)
android.view.View.performClick(View.java:4438)
android.view.View$PerformClick.run(View.java:18422)
android.os.Handler.handleCallback(Handler.java:733)
android.os.Handler.dispatchMessage(Handler.java:95)
會打印出耗時相關(guān)代碼的信息,然后可以通過該log定位到耗時的地方。
三、 利用Choreographer
Android系統(tǒng)每隔16ms發(fā)出VSYNC信號,觸發(fā)對UI進行渲染。SDK中包含了一個相關(guān)類,以及相關(guān)回調(diào)。理論上來說兩次回調(diào)的時間周期應(yīng)該在16ms,如果超過了16ms我們則認為發(fā)生了卡頓,我們主要就是利用兩次回調(diào)間的時間周期來判斷:
大致代碼如下:
public class BlockDetectByChoreographer {
public static void start() {
Choreographer.getInstance()
.postFrameCallback(new Choreographer.FrameCallback() {
@Override
public void doFrame(long l) {
if (LogMonitor.getInstance().isMonitor()) {
LogMonitor.getInstance().removeMonitor();
}
LogMonitor.getInstance().startMonitor();
Choreographer.getInstance().postFrameCallback(this);
}
});
}
}
第一次的時候開始檢測,如果大于閾值則輸出相關(guān)堆棧信息,否則則移除。
使用方式和上述一致。
四、 利用Looper機制
先看一段代碼:
new Handler(Looper.getMainLooper())
.post(new Runnable() {
@Override
public void run() {}
}
該代碼在UI線程中的MessageQueue中插入一個Message,最終會在loop()方法中取出并執(zhí)行。
假設(shè),我在run方法中,拿到MessageQueue,自己執(zhí)行原本的Looper.loop()
方法邏輯,那么后續(xù)的UI線程的Message就會將直接讓我們處理,這樣我們就可以做一些事情:
public class BlockDetectByLooper {
private static final String FIELD_mQueue = “mQueue”;
private static final String METHOD_next = “next”;
public static void start() {
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
try {
Looper mainLooper = Looper.getMainLooper();
final Looper me = mainLooper;
final MessageQueue queue;
Field fieldQueue = me.getClass().getDeclaredField(FIELD_mQueue);
fieldQueue.setAccessible(true);
queue = (MessageQueue) fieldQueue.get(me);
Method methodNext = queue.getClass().getDeclaredMethod(METHOD_next);
methodNext.setAccessible(true);
Binder.clearCallingIdentity();
for (; ; ) {
Message msg = (Message) methodNext.invoke(queue);
if (msg == null) {
return;
}
LogMonitor.getInstance().startMonitor();
msg.getTarget().dispatchMessage(msg);
msg.recycle();
LogMonitor.getInstance().removeMonitor();
}
} catch (Exception e) {
e.printStackTrace();
}
}
自我介紹一下,小編13年上海交大畢業(yè),曾經(jīng)在小公司待過,也去過華為、OPPO等大廠,18年進入阿里一直到現(xiàn)在。
深知大多數(shù)Android工程師,想要提升技能,往往是自己摸索成長或者是報班學(xué)習(xí),但對于培訓(xùn)機構(gòu)動則幾千的學(xué)費,著實壓力不小。自己不成體系的自學(xué)效果低效又漫長,而且極易碰到天花板技術(shù)停滯不前!
因此收集整理了一份《2024年Android移動開發(fā)全套學(xué)習(xí)資料》,初衷也很簡單,就是希望能夠幫助到想自學(xué)提升又不知道該從何學(xué)起的朋友,同時減輕大家的負擔(dān)。
既有適合小白學(xué)習(xí)的零基礎(chǔ)資料,也有適合3年以上經(jīng)驗的小伙伴深入學(xué)習(xí)提升的進階課程,基本涵蓋了95%以上Android開發(fā)知識點,真正體系化!
由于文件比較大,這里只是將部分目錄大綱截圖出來,每個節(jié)點里面都包含大廠面經(jīng)、學(xué)習(xí)筆記、源碼講義、實戰(zhàn)項目、講解視頻,并且后續(xù)會持續(xù)更新
如果你覺得這些內(nèi)容對你有幫助,可以添加V獲取:vip204888 (備注Android)
最后
文章不易,如果大家喜歡這篇文章,或者對你有幫助希望大家多多點贊轉(zhuǎn)發(fā)關(guān)注哦。文章會持續(xù)更新的。絕對干貨?。?!
-
Android進階學(xué)習(xí)全套手冊
關(guān)于實戰(zhàn),我想每一個做開發(fā)的都有話要說,對于小白而言,缺乏實戰(zhàn)經(jīng)驗是通病,那么除了在實際工作過程當(dāng)中,我們?nèi)绾稳ジ私鈱崙?zhàn)方面的內(nèi)容呢?實際上,我們很有必要去看一些實戰(zhàn)相關(guān)的電子書。目前,我手頭上整理到的電子書還算比較全面,HTTP、自定義view、c++、MVP、Android源碼設(shè)計模式、Android開發(fā)藝術(shù)探索、Java并發(fā)編程的藝術(shù)、Android基于Glide的二次封裝、Android內(nèi)存優(yōu)化——常見內(nèi)存泄露及優(yōu)化方案、.Java編程思想 (第4版)等高級技術(shù)都囊括其中。
-
Android高級架構(gòu)師進階知識體系圖
關(guān)于視頻這塊,我也是自己搜集了一些,都按照Android學(xué)習(xí)路線做了一個分類。按照Android學(xué)習(xí)路線一共有八個模塊,其中視頻都有對應(yīng),就是為了幫助大家系統(tǒng)的學(xué)習(xí)。接下來看一下導(dǎo)圖和對應(yīng)系統(tǒng)視頻吧?。。?br> -
Android對標(biāo)阿里P7學(xué)習(xí)視頻
-
BATJ大廠Android高頻面試題
這個題庫內(nèi)容是比較多的,除了一些流行的熱門技術(shù)面試題,如Kotlin,數(shù)據(jù)庫,Java虛擬機面試題,數(shù)組,F(xiàn)ramework ,混合跨平臺開發(fā),等
一個分類。按照Android學(xué)習(xí)路線一共有八個模塊,其中視頻都有對應(yīng),就是為了幫助大家系統(tǒng)的學(xué)習(xí)。接下來看一下導(dǎo)圖和對應(yīng)系統(tǒng)視頻吧?。?!
[外鏈圖片轉(zhuǎn)存中…(img-Sxm6W9sO-1711854533912)]
- Android對標(biāo)阿里P7學(xué)習(xí)視頻
[外鏈圖片轉(zhuǎn)存中…(img-2ZU4joCX-1711854533912)]文章來源:http://www.zghlxwxcb.cn/news/detail-851428.html
-
BATJ大廠Android高頻面試題
這個題庫內(nèi)容是比較多的,除了一些流行的熱門技術(shù)面試題,如Kotlin,數(shù)據(jù)庫,Java虛擬機面試題,數(shù)組,F(xiàn)ramework ,混合跨平臺開發(fā),等
[外鏈圖片轉(zhuǎn)存中…(img-HoGwiD4q-1711854533913)]
本文已被CODING開源項目:《Android學(xué)習(xí)筆記總結(jié)+移動架構(gòu)視頻+大廠面試真題+項目實戰(zhàn)源碼》收錄文章來源地址http://www.zghlxwxcb.cn/news/detail-851428.html
到了這里,關(guān)于Android UI性能優(yōu)化 檢測應(yīng)用中的UI卡頓的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!