Android App 性能優(yōu)化(一)----布局優(yōu)化

App 性能優(yōu)化系列:
Android App 性能優(yōu)化(二)----內(nèi)存泄露(Memory Leak)
Android App 性能優(yōu)化(一)----布局優(yōu)化

一. 概述

布局優(yōu)化在 Android 性能優(yōu)化中占有舉足輕重的作用, 如果布局層次復雜,嵌套過深, 這樣的布局就會導致在測量繪制的時候更耗時, 占用更多內(nèi)存, 很容易就會出現(xiàn)卡頓. 如果布局層次分明合理, 沒有冗余View的布局, 不僅可以提高加載速度, 提供一個良好的用戶體驗, 還能使我們的代碼更容易維護和重用.

二. 具體的優(yōu)化方案

(1). 選擇合適的 ViewGroup

  1. 優(yōu)先考慮使用 ConstraintLayout咨察,這也是google 推薦使用的布局 ConstraintLayout允許你在不嵌套的情況下復雜的布局,它與RelativeLayout非常相似俺泣,所有的view都依賴于兄弟控件和父控件的相對關系,但是ConstraintLayoutRelativeLayout更加靈活.
    目前通過 Android Studio 新建一個 layout xml 時默認的就是ConstraintLayout, 使用它可以有效減少了布局的層級,大幅提高性能.
    由于 Android 的碎片化程度高,手機屏幕尺寸眾多,使用ConstraintLayout能構建出多屏幕適配性更好的布局.
    ConstraintLayout使用介紹

  2. 盡量多使用 RelativeLayoutLinearLayout,不要使用絕對布局AbsoluteLayout
    在布局層次一樣的情況下, 建議使用 LinearLayout 代替 RelativeLayout, 因為 LinearLayout 性能要稍高一點;

LinearLayout 比 RelativeLayout 快的根本原因是 RelativeLayout 需要對其子View 進行兩次 measure 過程, 而 LinearLayout 則只需一次 measure 過程席爽,所以顯然會快于 RelativeLayout,但是如果 LinearLayout 中有 weight 屬性啊片,則也需要進行兩次measure只锻,但即便如此,應該仍然會比 RelativeLayout 快一點紫谷。

  1. RelativeLayout 的子View如果高度和 RelativeLayout不同齐饮,會引發(fā)效率問題,當子View很復雜時笤昨,這個問題會更加嚴重, 如果可以祖驱,盡量使用padding代替margin.
  2. 在層級深度相同的情況下, 優(yōu)先使用LinearLayoutFrameLayout而不是RelativeLayout

(2). 使用include, merge, ViewStub 標簽

1. **重用布局 **<include/>

<include/> 標簽可將布局中的公共部分提取出來供其他layout 瞒窒,以實現(xiàn)布局復用的目的, 這樣可以減少項目中重復的布局, 更能減少程序員的工作量.

比如include_progressbar.xml這個布局app的很多頁面都會用到,這時就可以將它抽出來, 以便達到重用的目的;
include_progressbar.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center">

    <ProgressBar
        android:id="@+id/pb"
        android:layout_width="50dp"
        android:layout_height="50dp" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="12dp"
        android:text="加載中..."/>
</LinearLayout>

這里寫圖片描述

activity_main.xml中使用:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="cjlcom.includetest.MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World! Hello World! Hello World! Hello World!" />

     <include
         android:id="@+id/pb_main"
         layout="@layout/include_progressbar">
     </include>

</android.support.constraint.ConstraintLayout>
這里寫圖片描述

2. 合并布局<merge/>

有時我們在使用<include/>后可能會導致出現(xiàn)相同ViewGroup的嵌套, 比如我們使用<include/>要引入的布局的根布局為FrameLayout, 并且引入之后該布局的父布局也是FrameLayout, 這時最終的布局就會出現(xiàn)兩層相同F(xiàn)rameLayout布局, 這種 layout 節(jié)點是多余的捺僻,會導致解析變慢,解決辦法就是通過<merge/>標簽去掉這多余的一層FrameLayout節(jié)點.

還有一種比較特殊的情況就是根布局是FrameLayout且不需要設置background或padding等屬性崇裁,可以用merge代替匕坯,因為Activity內(nèi)容試圖的parent view就是個FrameLayout,所以可以用merge消除只剩一個拔稳。

3. 按需加載<ViewStub/>

<viewstub/>標簽同<include/>標簽都可以用來引入一個外部布局葛峻,區(qū)別是<viewstub/>引入的布局默認不會去繪制,從而在解析layout時加快速度和減少內(nèi)存開銷.

<viewstub/>常用來引入那些默認不會顯示巴比,只在特殊情況下顯示的布局泞歉,如進度條布局逼侦、網(wǎng)絡加載失敗或者重試等刷新布局匿辩、信息出錯出現(xiàn)的提示布局等.

還有一種方法就是不需要立即加載的布局腰耙,設置visibility為GONE,系統(tǒng)會跳過铲球,不加載, 這種方法和<viewstub/>區(qū)別后續(xù)說明.

(3). 使用<Space/>控件

參考
[1] http://blog.csdn.net/hejjunlin/article/details/51159419

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末挺庞,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子稼病,更是在濱河造成了極大的恐慌选侨,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件然走,死亡現(xiàn)場離奇詭異援制,居然都是意外死亡,警方通過查閱死者的電腦和手機芍瑞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進店門晨仑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人拆檬,你說我怎么就攤上這事洪己。” “怎么了竟贯?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵答捕,是天一觀的道長。 經(jīng)常有香客問我屑那,道長拱镐,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任持际,我火速辦了婚禮沃琅,結果婚禮上,老公的妹妹穿的比我還像新娘选酗。我一直安慰自己阵难,他們只是感情好,可當我...
    茶點故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布芒填。 她就那樣靜靜地躺著呜叫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪殿衰。 梳的紋絲不亂的頭發(fā)上朱庆,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天,我揣著相機與錄音闷祥,去河邊找鬼娱颊。 笑死傲诵,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的箱硕。 我是一名探鬼主播拴竹,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼剧罩!你這毒婦竟也來了栓拜?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤惠昔,失蹤者是張志新(化名)和其女友劉穎幕与,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體镇防,經(jīng)...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡啦鸣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了来氧。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片诫给。...
    茶點故事閱讀 40,872評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖饲漾,靈堂內(nèi)的尸體忽然破棺而出蝙搔,到底是詐尸還是另有隱情,我是刑警寧澤考传,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布吃型,位于F島的核電站,受9級特大地震影響僚楞,放射性物質發(fā)生泄漏勤晚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一泉褐、第九天 我趴在偏房一處隱蔽的房頂上張望赐写。 院中可真熱鬧,春花似錦膜赃、人聲如沸挺邀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽端铛。三九已至,卻和暖如春疲眷,著一層夾襖步出監(jiān)牢的瞬間禾蚕,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工狂丝, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留换淆,地道東北人哗总。 一個月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像倍试,于是被迫代替她去往敵國和親讯屈。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,876評論 2 361