性能探究之onMeasure

雖然如今RecycleView大行其道伦腐,但作為老牌控件listview仍應(yīng)用廣泛灾搏,但真正使用時(shí)泄伪,由于業(yè)務(wù)上的需求以及開發(fā)人員的理解不深入殴蓬,使得listview性能并不十分高,造成卡頓

那么先從以下幾點(diǎn)進(jìn)行測(cè)試

  • 父布局類型(相對(duì),線性)
  • 布局嵌套深度

XML布局代碼

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical">

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="onClick"
        android:text="添加數(shù)據(jù)"/>

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="onToggle"
        android:text="顯示/隱藏"/>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@mipmap/ic_launcher"/>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical">

                <ImageView
                    android:id="@+id/imageview"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:src="@mipmap/ic_launcher"/>

                <com.hhwant.speed.app.TestListView
                    android:id="@+id/listview"
                    android:layout_width="match_parent"
                    android:layout_height="200dp"
                    >

                </com.hhwant.speed.app.TestListView>

            </LinearLayout>
        </LinearLayout>
    </LinearLayout>
</LinearLayout>

根布局LinearLayout染厅,再嵌套3層LinearLayout痘绎,內(nèi)置一個(gè)自定義Listview,自定義Listview的代碼很簡(jiǎn)單肖粮,只是單純?cè)趏nMeasure打印一段話

public class TestListView extends ListView {
    private static final String TAG = "TestListView";

    public TestListView(Context context) {
        super(context);
    }

    public TestListView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public TestListView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        Log.d(TAG, "onMeasure");
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }
}

先看LinearLayout多層嵌套下的效果

LinearLayout_listview.jpg線性布局嵌套測(cè)試——無(wú)權(quán)重.gif
  • 可以見到的是在LinearLayout嵌套了3層的情況下,進(jìn)入界面初始化調(diào)用了2次onMeasure()
  • 讓與listview同層級(jí)的imageview消失(GONE)后孤页,不會(huì)間接觸發(fā)listview調(diào)用onMeasure
  • 讓listview里的item圖片visible或者gone,會(huì)同樣的讓listview調(diào)用一個(gè)onMeasure

那么給ListView設(shè)置權(quán)重以后再看效果


LinearLayout_listview.jpg線性布局嵌套測(cè)試——有權(quán)重.gif
  • 和前者的不同之處在于設(shè)置了權(quán)重以后涩馆,listview同級(jí)的imageview設(shè)置visible和gone后行施,會(huì)間接讓listview重新調(diào)用onMeasure來(lái)重新計(jì)算listview的高度

再來(lái)看看RelativeLayout多層嵌套下的效果

RelativeLayout_listview.jpg相對(duì)布局嵌套測(cè)試.gif
  • 可以見到的是在RelativeLayout嵌套了3層的情況下,進(jìn)入界面初始化調(diào)用了16次onMeasure() ,即2^4
  • 讓與listview同層級(jí)的imageview消失(GONE)后,會(huì)間接觸發(fā)listview調(diào)用8次onMeasure,即2^3
  • 讓listview里的item圖片visible或者gone魂那,會(huì)同樣的讓listview調(diào)用8次onMeasure,即2^3

因RelativeLayout的特殊性蛾号,功能的豐富性同時(shí)導(dǎo)致了其性能的低下,在界面初始化時(shí)需調(diào)用兩次onMeasure()涯雅,而RelativeLayout內(nèi)部的onMeasure方法更是需要遍歷子view鲜结,分別橫向和縱向測(cè)量子view

那么我們可以得出一個(gè)結(jié)論,在能實(shí)現(xiàn)需求和功能的前提下斩芭,基礎(chǔ)布局盡量不選擇RelativeLayout轻腺,特別是ListView在RelativeLayout的嵌套下,多次調(diào)用onMeasure(),而ListView又在onMeasure調(diào)用了getView划乖,大部分的邏輯在getView中贬养,指數(shù)次調(diào)用必然導(dǎo)致性能的大幅下降

參考資料

Android應(yīng)用性能優(yōu)化系列視圖篇——三大基礎(chǔ)布局性能比較
Android應(yīng)用性能優(yōu)化系列視圖篇——ListView自適應(yīng)導(dǎo)致的嚴(yán)重性能問(wèn)題
Android源碼(這個(gè)就自己進(jìn)布局源碼看吧)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市琴庵,隨后出現(xiàn)的幾起案子误算,更是在濱河造成了極大的恐慌,老刑警劉巖迷殿,帶你破解...
    沈念sama閱讀 212,542評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件儿礼,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡庆寺,警方通過(guò)查閱死者的電腦和手機(jī)蚊夫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)懦尝,“玉大人知纷,你說(shuō)我怎么就攤上這事×昝梗” “怎么了琅轧?”我有些...
    開封第一講書人閱讀 158,021評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)踊挠。 經(jīng)常有香客問(wèn)我乍桂,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,682評(píng)論 1 284
  • 正文 為了忘掉前任睹酌,我火速辦了婚禮权谁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘忍疾。我一直安慰自己闯传,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,792評(píng)論 6 386
  • 文/花漫 我一把揭開白布卤妒。 她就那樣靜靜地躺著甥绿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪则披。 梳的紋絲不亂的頭發(fā)上共缕,一...
    開封第一講書人閱讀 49,985評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音士复,去河邊找鬼图谷。 笑死,一個(gè)胖子當(dāng)著我的面吹牛阱洪,可吹牛的內(nèi)容都是我干的便贵。 我是一名探鬼主播,決...
    沈念sama閱讀 39,107評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼冗荸,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼承璃!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起蚌本,我...
    開封第一講書人閱讀 37,845評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤盔粹,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后程癌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體舷嗡,經(jīng)...
    沈念sama閱讀 44,299評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,612評(píng)論 2 327
  • 正文 我和宋清朗相戀三年嵌莉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了进萄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,747評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡锐峭,死狀恐怖中鼠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情只祠,我是刑警寧澤兜蠕,帶...
    沈念sama閱讀 34,441評(píng)論 4 333
  • 正文 年R本政府宣布扰肌,位于F島的核電站抛寝,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜盗舰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,072評(píng)論 3 317
  • 文/蒙蒙 一晶府、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧钻趋,春花似錦川陆、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至失仁,卻和暖如春尸曼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背萄焦。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工控轿, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人拂封。 一個(gè)月前我還...
    沈念sama閱讀 46,545評(píng)論 2 362
  • 正文 我出身青樓茬射,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親冒签。 傳聞我的和親對(duì)象是個(gè)殘疾皇子在抛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,658評(píng)論 2 350

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