Android性能優(yōu)化方法:布局優(yōu)化

前言

本節(jié)將介紹一些有效的性能優(yōu)化方法三圆,主要內(nèi)容包括布局優(yōu)化狞换,繪制優(yōu)化、內(nèi)存泄漏優(yōu)化舟肉、響應(yīng)速度優(yōu)化修噪、ListView優(yōu)化、Bitmap優(yōu)化路媚、線程優(yōu)化以及一些性能優(yōu)化建議黄琼,在介紹響應(yīng)速度優(yōu)化的同時(shí)還會(huì)介紹ANR日志的分析方法。

布局優(yōu)化

布局優(yōu)化的思想很簡(jiǎn)單整慎,就是盡量減少布局文件的層級(jí)脏款,這個(gè)道理很淺顯的围苫,布局中的層級(jí)少了,這就意味著Android繪制是的工作量減少了撤师,那么程序的性能自然就提高了剂府。

如何進(jìn)行布局優(yōu)化呢?首先刪除布局中無(wú)用的空間和層級(jí)剃盾,其次有選擇地使用性能較低的ViewGroup周循,比如RelativeLayout。如果布局中既可以使用LinearLayout也可以使用RelativeLayout万俗,那么就采用LinearLayout,這是應(yīng)為RelativeLayout 的功能比較復(fù)雜饮怯,他的布局過(guò)程需要花費(fèi)更多的CPU時(shí)間闰歪。FrameLayout和LinearLayout一樣都是一種簡(jiǎn)單高效的ViewGroup,因此可以考慮使用它們蓖墅,但是很多時(shí)候單純通過(guò)一個(gè)LinearLayout或者FrameLayout 無(wú)法實(shí)現(xiàn)產(chǎn)品效果库倘,需要通過(guò)嵌套的方式來(lái)完成。這種情況下還是建議采用RelativeLayout论矾,因?yàn)閂iewGroup的嵌套就相當(dāng)于增加了布局的層級(jí)教翩,同樣會(huì)降低程序的性能。

布局優(yōu)化的另一種手段是采用<include>標(biāo)簽贪壳、<merge>標(biāo)簽饱亿、ViewStub<include>標(biāo)簽主要用于布局重用闰靴,<merge>標(biāo)簽一般和<include>標(biāo)簽配合使用彪笼,他可以降低減少布局的層級(jí),ViewStub則提供了按需加載的功能蚂且,當(dāng)需要時(shí)才會(huì)將ViewStub中的布局加載到內(nèi)存中配猫,者提高了程序的初始化效率,下面分別介紹他們的使用方法杏死。

<include>標(biāo)簽

<include>標(biāo)簽可以將一個(gè)指定的布局文件加載到當(dāng)前的布局文件中泵肄。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/bg"
    android:orientation="vertical" >
    
    <include 
        layout="@layout/actionbar_layout"/>
</LinearLayout>

上面代碼中,@layout/actionbar_layout 指定了另一個(gè)布局文件淑翼,通過(guò)這種方式就不用把 actionbar_layout 這個(gè)布局文件的內(nèi)容在重復(fù)一遍了腐巢,這就是<include>的好處。<include>標(biāo)簽只支持以android:layout_開(kāi)頭的 屬性窒舟,比如android:layout_width系忙、android:layout_height,其他屬性是不支持的惠豺,比如android:background银还。當(dāng)然风宁,android:id 這個(gè)屬性是個(gè)特例,如果 <include>指定了這個(gè)id屬性蛹疯,同時(shí)被包含的布局文件的根元素也指定了id屬性 戒财,那么以<include>指定的id屬性為準(zhǔn)。需要注意的是捺弦,如果<include>標(biāo)簽指定了android:layout_這種屬性饮寞,那么要求android:layout_width和android:layout_height必須存在,否則其他android:layout_形式的屬性無(wú)法生效列吼,下面是一個(gè)指定了android:layout_*屬性的實(shí)例幽崩。

<include android:id="@+id/new_title"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        layout="@layout/actionbar_layout"/>

<merge>標(biāo)簽

<merge>標(biāo)簽一般和<include>標(biāo)簽一起使用從而減少布局的層級(jí)。在上面的實(shí)例中寞钥,由于當(dāng)前布局是一個(gè)豎直方向的LinearLayout,這個(gè)時(shí)候如果被包含的布局文件中也采用了豎直方向的LinearLayout慌申,那么顯然被包含的布局文件中的LinearLayout是多余的,通過(guò)<merge>標(biāo)簽就可以去掉多余的那一層LinearLayout理郑。

<merge xmlns:android="http://schemas.android.com/apk/res/android">
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@+id/btn1" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@+id/btn2" />
</merge>

ViewStub

ViewStub繼承了View蹄溉,它非常輕量級(jí)且寬/高都是0,因此它本身不參與任何的布局和繪制過(guò)程您炉。ViewStub的意義在于按需加載所需的布局文件柒爵,在實(shí)際開(kāi)發(fā)中,有很多布局文件在正常情況下不會(huì)顯示赚爵,比如網(wǎng)絡(luò)異常時(shí)的界面棉胀,這個(gè)時(shí)候就沒(méi)有必要再整個(gè)界面初始化的時(shí)候?qū)⑵浼虞d進(jìn)來(lái),通過(guò)ViewStub就可以做到在使用的時(shí)候再加載提高程序初始化時(shí)的性能冀膝。

<ViewStub
            android:id="@+id/stub_import"
            android:inflatedId="@+id/pane_import"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            layout="@layout/layout_network_error" />

其中stub_import 是ViewStub 的id膏蚓,而 panel_import 是layout_network_error這個(gè)布局的根元素id。在需要加載ViewStub中布局的時(shí)候畸写,有一下兩種方式:

((ViewStub) findViewById(R.id.stub_import)).setVisibility(View.VISIBLE);

或者

((ViewStub) findViewById(R.id.stub_import)).inflate();

當(dāng)ViewStub 通過(guò)setVisibility或者inflate方法加載后驮瞧,ViewStub就會(huì)被它內(nèi)部的布局替換掉,這個(gè)時(shí)候ViewStub就不在是整個(gè)布局結(jié)構(gòu)的一部分了枯芬。另外目前ViewStub還不支持<merge>標(biāo)簽论笔。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市千所,隨后出現(xiàn)的幾起案子狂魔,更是在濱河造成了極大的恐慌,老刑警劉巖淫痰,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件最楷,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)籽孙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門烈评,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人犯建,你說(shuō)我怎么就攤上這事讲冠。” “怎么了适瓦?”我有些...
    開(kāi)封第一講書人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵竿开,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我玻熙,道長(zhǎng)否彩,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任嗦随,我火速辦了婚禮胳搞,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘称杨。我一直安慰自己,他們只是感情好筷转,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布姑原。 她就那樣靜靜地躺著,像睡著了一般呜舒。 火紅的嫁衣襯著肌膚如雪锭汛。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 49,772評(píng)論 1 290
  • 那天袭蝗,我揣著相機(jī)與錄音唤殴,去河邊找鬼。 笑死到腥,一個(gè)胖子當(dāng)著我的面吹牛朵逝,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播乡范,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼配名,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了晋辆?” 一聲冷哼從身側(cè)響起渠脉,我...
    開(kāi)封第一講書人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎瓶佳,沒(méi)想到半個(gè)月后芋膘,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年为朋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了臂拓。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡潜腻,死狀恐怖埃儿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情融涣,我是刑警寧澤童番,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站威鹿,受9級(jí)特大地震影響剃斧,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜忽你,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一幼东、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧科雳,春花似錦根蟹、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至尿赚,卻和暖如春散庶,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背凌净。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工悲龟, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人冰寻。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓须教,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親斩芭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子没卸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

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