這是一個(gè)普遍的誤解,使用基本的布局結(jié)構(gòu)是最高效率的布局。然而,每個(gè)你加入你的應(yīng)用程序的組件和布局 都需要初始化,布局,和繪制。例如,使用嵌套的LinearLayout實(shí)例能導(dǎo)致一個(gè)過(guò)深的視圖結(jié)構(gòu)。而且,嵌入 幾個(gè)使用laytou_wight參數(shù)的LinearLyaout實(shí)例,由于每個(gè)孩子需要被測(cè)量?jī)纱螌?dǎo)致特別昂貴的開(kāi)銷(xiāo)。當(dāng)布局是 一個(gè)反復(fù)的填充的時(shí)候,這個(gè)特別重要,例如當(dāng)被使用在一個(gè)ListView或者GridView中時(shí)。
在這個(gè)課程當(dāng)中,你將會(huì)學(xué)習(xí)使用Hierarchyt Viewer和Layotopt來(lái)檢查和優(yōu)化你的布局。
檢查你的布局
———————————————————————————————— ——————— ——————— ——————— ——————— ——
Android SDK工具包含了一個(gè)被稱為Hierarchy Viewer的工具,它允許你在你的應(yīng)用程序運(yùn)行的時(shí)候分析你的布 局。使用這個(gè)工具幫助你發(fā)現(xiàn)在你的布局性能里面的瓶頸。
Hierachy Viewer允許你選擇在一個(gè)連接的設(shè)備或者模擬器運(yùn)行進(jìn)程,然后顯示這個(gè)布局樹(shù)。在每個(gè)模塊的交通 燈代表了它的測(cè)量值,布局和繪制性能,幫助你確定潛在的問(wèn)題。
例如,F(xiàn)igure 1顯示了一個(gè)布局,它被用做在一個(gè)ListView中的現(xiàn)象。這個(gè)布局在左邊顯示了一個(gè)小的位圖,和 在右邊堆放了兩個(gè)文本項(xiàng)。它是尤其的重要由于這個(gè)布局將會(huì)被填充到多個(gè)選項(xiàng)—如這個(gè)—被優(yōu)化性能執(zhí)行效 率 將會(huì)成倍增加。
這個(gè)hierarchyviewer工具在<sdk>/tools/目錄下提供,當(dāng)被打開(kāi)的時(shí)候,這個(gè)Hierarchy Viewer顯示了一列有 效設(shè)備和它正在運(yùn)行的組件。點(diǎn)擊Load View Hierarchy來(lái)查看這個(gè)被選擇組件的布局結(jié)構(gòu)。例如,F(xiàn)igure 2顯 示了Figure 1中列表項(xiàng)的布局。
在Figure 2中,你能看見(jiàn)一個(gè) 有一些問(wèn)題的 顯示文本的三級(jí)結(jié)構(gòu)。點(diǎn)擊這個(gè)選項(xiàng),顯示過(guò)程每個(gè)階段使用的時(shí) 間(Figure 3)。這樣哪個(gè)選項(xiàng)花費(fèi)最長(zhǎng)時(shí)間的測(cè)量,布局,和渲染,和哪里你應(yīng)該花費(fèi)時(shí)間來(lái)優(yōu)化,就變得 清晰了。
使用這個(gè)布局渲染整個(gè)列表項(xiàng)使用的時(shí)間是:
-
測(cè)量:0.977ms
-
布局:0.167ms
-
繪制:2.717ms
修正你的布局
————————————————————————————— ——— ——— ——— ——— ——— ——— ——— ——— ——— ——————
因?yàn)榍度氲腖inearLayout使這個(gè)布局性能過(guò)于緩慢,這個(gè)性能可能通過(guò)壓扁這個(gè)布局來(lái)改善—使這個(gè)布局扁且 寬,而不是窄且深。RelativeLayout可以作為這樣布局的的根節(jié)點(diǎn)。所以,當(dāng)這個(gè)設(shè)計(jì)轉(zhuǎn)變成使用RelativeLay out,你能看見(jiàn)這個(gè)布局成為一個(gè)2級(jí)的結(jié)構(gòu)。檢查這個(gè)新的布局如下:
現(xiàn)在渲染一個(gè)列表項(xiàng)花費(fèi):
-
測(cè)量:0.598ms
-
布局:0.110ms
-
繪制:2.146ms
可能看起來(lái)是一個(gè)很小的提升,但是這個(gè)時(shí)間是成倍的,因?yàn)檫@個(gè)布局被用于在一個(gè)列表的每個(gè)選項(xiàng)。
由于在LinearLayout設(shè)計(jì)的時(shí)候使用了layout_weight屬性,大多數(shù)時(shí)間是不同的,它能減慢測(cè)量的速度。這 僅僅是每個(gè)布局如何被合適的使用,和你應(yīng)該考慮使用layout_weight是必要的的一個(gè)例子。
使用Lint
—————————— ——— ——— ——— ——— ——— ——— ——— ——— ——— —————————————————————————
運(yùn)行Lint工具, 在你的布局文件中搜索可能的視圖結(jié)構(gòu)最佳化是好的方式。Lint已經(jīng)替代了Layoutopt工具,并 且有更多更強(qiáng)大的功能。Lint規(guī)則的一些例子如下:
-
使用復(fù)合圖片 — 一個(gè)包含一個(gè)ImageView和一個(gè)TextView的LinearLayout作為一個(gè)復(fù)合圖片能被高效的 處 理。
-
合并根框架 — 如果一個(gè)FrameLayout是一個(gè)布局的根,沒(méi)有提供背景或者填充等,它能被一個(gè)更高效的 m erge標(biāo)記來(lái)替代。
-
無(wú)用的葉子 — 一個(gè)沒(méi)有孩子或者沒(méi)有背景的布局通常被移除(因?yàn)樗遣豢梢?jiàn)的),為了一個(gè)更均勻的 和 更高效的布局結(jié)構(gòu)。
-
無(wú)效的父母 — 一個(gè)布局有孩子,它沒(méi)有兄弟,它不是一個(gè)ScrollView或者一個(gè)根布局,并且沒(méi)有一個(gè)背 景 ,可以被移除,并且它的孩子直接放入這個(gè)父母中,為了一個(gè)均勻且高效的布局結(jié)構(gòu)。
-
深布局 — 擁有過(guò)多嵌套不利于性能的布局。 考慮使用均勻的布局,如RelativeLayout或者Gridlayout來(lái)提 升性能。這個(gè)默認(rèn)的最大深度為10。
Lint的其它的好處是它被整合到Eclipse的Android Development Tools(ADT 16+)。每當(dāng)你輸出一個(gè)APK的時(shí)候 Lint自動(dòng)運(yùn)行,編輯和保存一個(gè)XML文件,或者使用這個(gè)布局編輯器。為了手動(dòng)打開(kāi)Lint,點(diǎn)擊在Eclipse工具 欄的Lint按鈕。
當(dāng)在Eclipse中被使用的時(shí)候,Lint有自動(dòng)固定一些問(wèn)題的能力,為別人提供建議和直接跳到出錯(cuò)的代碼檢查。 如果你沒(méi)有使用Eclipse開(kāi)發(fā),Lint也能通過(guò)命令行運(yùn)行。更多關(guān)于Lint的信息可以在tools.android.com中。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
