文集目錄
ps:喜歡的點(diǎn)贊哦 android性能跟蹤分析工具系列 - 目錄
Hierarchy Viewer工具提供了一個(gè)可視化界面顯示布局的層次結(jié)構(gòu)留夜,讓我們可以進(jìn)行調(diào)試惋增,從而優(yōu)化界面布局結(jié)構(gòu)。
不要小看這個(gè)工具啊暖释,這可是必備工具啊,遙想當(dāng)年,因?yàn)榻缑娌季謴?fù)雜桩砰,我寫的個(gè)人中心界面可是差不多2s 才顯示出來啊,優(yōu)化起來那叫一個(gè)痛苦啊释簿,奈何 UI 給的設(shè)計(jì)圖太他媽復(fù)雜了亚隅,UI 自己都是瞎往上拖控件,他自己都不知道為了啥辕万,就是知道你開發(fā)就是不能改枢步,那排版反人類啊,好在現(xiàn)在有了 ConstraintLayout 約束布局渐尿,這個(gè)用好了簡直利器啊醉途,一般人我可不告訴他哈。
閑話不多說砖茸,先來看看 Hierarchy Viewer 長啥樣子
整個(gè)工具分3個(gè)部分隘擎,左邊的是布局層次圖,使用滾輪可以放大縮小的凉夯,點(diǎn)擊具體的 view 是可以查看view 的3 measu/layout/draw 方法的耗時(shí)的货葬,顏色部分,綠色是計(jì)算很快劲够,黃色是計(jì)算速度在所有的view 中居中震桶,50%的水平,紅色是計(jì)算很慢征绎,是需要嚴(yán)重關(guān)注的蹲姐。
右上角的是縮略圖不多說,右下角的是我們在層次圖中選中的 view 在整個(gè)界面的位置人柿,紅框占中的就是柴墩,這里我選的是根視圖,所以把整個(gè)界面都包括進(jìn)來了
注意啊凫岖,我們剛剛進(jìn)來是需要選中根視圖江咳,然后點(diǎn)擊我在上面用紅框圈中的按鈕,點(diǎn)一下就是重新計(jì)算哥放,注意點(diǎn)一下就行歼指,第一次計(jì)算才是頁面啟動(dòng)時(shí)的用時(shí)爹土,你再點(diǎn)都是刷新頁面的用時(shí)了
如何啟動(dòng)
好了上面簡單說了下這個(gè)工具我們看哪,現(xiàn)在就來說說這個(gè)工具怎么打開
打開 Android devices trace 东臀,之前介紹過了
在 DDMS 中我們點(diǎn)擊 Hierarchy Viewer 着饥,然后選擇我們需要查看的進(jìn)程就中的具體的某個(gè)頁面,再點(diǎn)這個(gè)Hierarchy Viewer按鈕
如何優(yōu)化布局層次
好了惰赋, 這個(gè)工具打開和使用都很簡單宰掉,主要的我們需要借助這個(gè)工具查看我們的頁面布局水平,要是發(fā)現(xiàn)效率低赁濒,必須優(yōu)化的轨奄,所以本篇的重點(diǎn)就來了,就是如何優(yōu)化布局層次拒炎,方法如下:
- 線性布局比相對布局有布局優(yōu)勢
在布局層級相同的情況下挪拟,相對布局比線性布局會多跑 measu 方法,效率第一點(diǎn)击你。這點(diǎn)效率優(yōu)勢比少一層布局層級來說要輕微許多玉组。 - 使用ConstraintLayout 約束布局
約束布局的 view 相互定位方式真的太強(qiáng)大了,極端情況下丁侄,我們的內(nèi)容布局用一層就可以 - 使用 ViewStub
在布局中有的 layout 我們可能很少顯示他惯雳,這樣 ViewStub ,stubView在不顯示時(shí)是不會參與布局相關(guān)計(jì)算的鸿摇,屬于延遲加載的一種了石景。 - 使用 space 標(biāo)簽
space 標(biāo)簽繼承自 view,但是把 draw方法做了空實(shí)現(xiàn)拙吉,所以不會進(jìn)行繪制 - 使用merge減少無用的父布局
merge使用起來有很多限制潮孽,具體使用機(jī)會比較少。
下面我說下比較容易忘的
ViewStub的使用
ViewStub是一個(gè)用于在運(yùn)行時(shí)加載布局資源筷黔、不可見往史、寬高為0的View,在布局文件中使用它只是用于占位佛舱,在代碼中沒有手動(dòng)加載它時(shí)怠堪,并不會影響頁面的測量、繪制名眉、顯示效率,在代碼中通過inflate加載ViewStub時(shí)凰棉,ViewStub會用在布局文件中為其指定的布局文件來代替它自身损拢,通過前面的解釋可想而知,ViewStub只能夠被inflate一次撒犀,一旦加載后ViewStub對象就會被置為空福压;ViewStub標(biāo)簽有對應(yīng)的java類ViewStub.java掏秩,通過閱讀源碼可以發(fā)現(xiàn),確實(shí)在初始化的時(shí)候設(shè)置為隱藏荆姆、不繪制蒙幻、寬高為0,并且它復(fù)寫了View的dispatchDraw和draw方法胆筒,這倆方法是空方法邮破,沒有調(diào)用super的方法,也沒有執(zhí)行自己的代碼
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_b);
mViewStub = (ViewStub) findViewById(R.id.view_show);
}
public void showViewStub(View view) {
// mSHowView是 vie2wstub 顯示之后獲得的 view 對象
if (mSHowView == null) {
mSHowView = mViewStub.inflate();
return;
}
mSHowView.setVisibility(View.VISIBLE);
}
恩仆救,viewstub 使用很簡單抒和,記得我們在 inflate() 之后會返回實(shí)體的 view,之后我們再顯示隱藏彤蔽,操作的都是這個(gè) view 了
space 標(biāo)簽
space標(biāo)簽可以只在布局文件中占位摧莽,不繪制,Space標(biāo)簽有對應(yīng)的java類Space.java顿痪,通過閱讀源碼可以發(fā)現(xiàn)镊辕,它繼承至View.java,并且復(fù)寫了draw方法蚁袭,該方法為空征懈,既沒有調(diào)用父類的draw方法,也沒有執(zhí)行自己的代碼撕阎,表示該類是沒有繪制操作的受裹,但onMeasure方法正常調(diào)用,說明是有寬高的虏束。這可是神器啦棉饶。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="2"
android:gravity="center"
android:text="TextView 1"
android:textColor="@android:color/black"
android:textSize="28dp"
android:background="@android:color/darker_gray"/>
<Space
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:background="@android:color/black"/>
<TextView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="2"
android:gravity="center"
android:text="TextView 2"
android:textColor="@android:color/black"
android:textSize="28dp"
android:background="@android:color/darker_gray"/>
<Space
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"/>
<TextView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="2"
android:gravity="center"
android:text="TextView 3"
android:textColor="@android:color/black"
android:textSize="28dp"
android:background="@android:color/darker_gray"/>
</LinearLayout>
效果圖:
給第一個(gè) space 設(shè)置背景色,實(shí)際是不會生效的镇匀,別忘了 space 的 draw方法可是空的