Android布局性能調(diào)優(yōu)

前言

在Android開發(fā)中郊尝,View的展示是最貼近用戶,也是最能直觀展示產(chǎn)品的手段。除了美觀的界面之外杖虾,View的性能也是很重要的。

而View是由一層一層的View嵌套而成媒熊,形成類似于樹的層級結(jié)構(gòu)奇适,通過層級結(jié)構(gòu)展示View。View樹的深度決定了展示的流暢度芦鳍,深度越深嚷往,繪制需要的時間也就越長,體驗效果越差柠衅。優(yōu)化布局從另一方面說皮仁,也是就是想辦法降低View樹的深度,提高加載速度菲宴,達到性能調(diào)優(yōu)贷祈。

下面介紹三個日常開發(fā)中可能會使用到的布局優(yōu)化標簽,以及一個實際開發(fā)中可能碰到的問題和解決方式喝峦。

代碼比較簡潔有的甚至沒有势誊,但是標簽本來就是一些工具而已,把最后實戰(zhàn)方面的看懂了谣蠢,汲取了這種封裝的思想粟耻,我寫這篇文章的目的就達到了。

include標簽

當一個View需要復用的時候漩怎,采取<include/>標簽可以減少重復布局的使用勋颖。

使用場景

<include/>標簽可能接觸的都比較多,在Android布局中勋锤,很多時候會碰到需要使用相同的布局饭玲,例如每個Activity的TitleBar,評論框等叁执。這個時候可以使用<include/>標簽茄厘。

步驟

  1. 新建一個title.xml,在里面寫好對應的布局文件的實現(xiàn)谈宛,
  1. 在需要使用的地方使用
other code...

<include layout="@layout/titlebar"/>

ViewStub標簽

<ViewStub/>是一種不可見且大小為0的View次哈,它的主要作用是當你不需要的時候不加載,當你需要的時候才去加載這個布局吆录。也就是說<ViewStub/>實現(xiàn)了View的延遲加載窑滞。

需要注意的是:當ViewStub設(shè)置為可見或者被inflate之后,就會填充布局資源,之后會被填充的View給替代哀卫,和普通的View沒有任何區(qū)別巨坊。

使用場景

錯誤圖,也就是當數(shù)據(jù)錯誤的時候需要展示的一些圖片和提示信息此改。但是這個錯誤圖又不是每次都會顯示趾撵,大部分情況下都是正常顯示,只有當出現(xiàn)一些問題的時候才會顯示錯誤圖共啃,這個時候就可以使用<ViewStub/>

步驟

  1. 在需要使用的地方使用<ViewStub/>標簽
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
 

    <ViewStub
        android:id="@+id/network_error_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout="@layout/network_error"
        android:inflatedId="@+id/error_view"/>
 
</RelativeLayout>

2.新建network_error.xml文件

比如說一個ImageView

other code...

3.代碼中使用

ViewStub stub = (ViewStub)findViewById(R.id.network_error_layout);
networkErrorView = stub.inflate();

在ViewStub中:

android:layout表示當需要展示的時候?qū)故镜腖ayout

android:inflatedId表示當在Java代碼中調(diào)用ViewStub的inflate()或者setVisibility()方法返回的Id占调,也是就填充圖Id。

merge標簽

減少View樹深度的利器

使用場景

在一般情況下移剪,比如在ViewPager或者RecyclerView中究珊,我們在每個Item的根布局中往往是使用LinearLayout或者其他的ViewGroup。如果有的時候我們只需要展示一張照片或者單獨文字纵苛,這樣就很不值得苦银,因為每個ViewGroup對應的就在View樹中又往深了一步。這個時候使用<merge/>標簽來減少View樹的深度再好不過赶站。

merge標簽可用于兩種典型情況:

  • 布局頂結(jié)點是FrameLayout且不需要設(shè)置background或padding等屬性幔虏,可以用merge代替,因為Activity內(nèi)容視圖的parent view就是個FrameLayout贝椿,所以可以用merge消除只剩一個想括。
  • 某布局作為子布局被其他布局include時,使用merge當作該布局的頂節(jié)點烙博,這樣在被引入時頂結(jié)點會自動被忽略瑟蜈,而將其子節(jié)點全部合并到主布局中。

步驟

<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
 
    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="@dimen/dp_40"
        android:layout_above="@+id/text"/>
 
    <TextView
        android:id="@+id/text"
        android:layout_width="match_parent"
        android:layout_height="@dimen/dp_40"
        android:layout_alignParentBottom="true"
        android:text="@string/app_name" />
 

優(yōu)化實戰(zhàn)例子

需求

在開發(fā)中有的時候TitleBar需要實現(xiàn)各種不同的布局渣窜,比如這個Activity需要一個TextView铺根,這個Activity可能需要一個EditText,或者各種自定義View乔宿。

這個時候如果每個Activity的TItleBar都對應寫新的布局位迂,這樣無疑加大了工作量。

思路(!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!)

我們可以將這個TitleBar很Activity邏輯分離详瑞,抽出布局作為titlebar.xml掂林,里面包含了各種View。

然后再抽出一個TitleBar.class類坝橡,組合放在BaseActivity中泻帮。共通的東西可以在BaseActivity實現(xiàn)(比如左前方返回按鈕),不同的東西放在子類中實現(xiàn)(EditText或者自定義View)计寇,靈活使用ViewStud實現(xiàn)延遲加載锣杂,merge減少層級脂倦。

代碼結(jié)構(gòu)可以使用Builder模式實現(xiàn),注意<ViewStub/>和<merge/>的使用元莫,注意空指針以及容錯狼讨,這樣就實現(xiàn)了一個標準TitleBar控件。

后話

還有一些很好的工具可以實現(xiàn)布局優(yōu)化柒竞,比如Android Studio的lint,TraceView,HierarchyViewer,手機自帶的開發(fā)人員選項中的工具等等等。

規(guī)范的布局代碼加上工具檢測播聪,布局優(yōu)化就OK了朽基。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市离陶,隨后出現(xiàn)的幾起案子稼虎,更是在濱河造成了極大的恐慌,老刑警劉巖招刨,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件霎俩,死亡現(xiàn)場離奇詭異,居然都是意外死亡沉眶,警方通過查閱死者的電腦和手機打却,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來谎倔,“玉大人柳击,你說我怎么就攤上這事∑埃” “怎么了捌肴?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長藕咏。 經(jīng)常有香客問我状知,道長,這世上最難降的妖魔是什么孽查? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任饥悴,我火速辦了婚禮,結(jié)果婚禮上盲再,老公的妹妹穿的比我還像新娘铺坞。我一直安慰自己,他們只是感情好洲胖,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布济榨。 她就那樣靜靜地躺著,像睡著了一般绿映。 火紅的嫁衣襯著肌膚如雪擒滑。 梳的紋絲不亂的頭發(fā)上腐晾,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天,我揣著相機與錄音丐一,去河邊找鬼藻糖。 笑死,一個胖子當著我的面吹牛库车,可吹牛的內(nèi)容都是我干的巨柒。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼柠衍,長吁一口氣:“原來是場噩夢啊……” “哼洋满!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起珍坊,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤牺勾,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后阵漏,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體驻民,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年履怯,在試婚紗的時候發(fā)現(xiàn)自己被綠了回还。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡叹洲,死狀恐怖懦趋,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布安吁,位于F島的核電站认境,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望坎缭。 院中可真熱鬧,春花似錦签钩、人聲如沸掏呼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽憎夷。三九已至,卻和暖如春昧旨,著一層夾襖步出監(jiān)牢的瞬間拾给,已是汗流浹背祥得。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蒋得,地道東北人级及。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像额衙,于是被迫代替她去往敵國和親饮焦。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

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