[整]Android開發優化-佈局優化

優化佈局層次結構

一個廣泛的誤解就是,使用基本的佈局結構會產生高效的佈局性能。然而每個添加到應用的控件和佈局,都須要初始化,佈局位置和繪製。好比,使用一個嵌套的LinearLayout會致使過深的佈局層次結構。此外,嵌套多個使用layout_weight屬性的LinearLayout實例會花費更大的代價,由於每個子佈局都要測量兩次。當某個佈局被頻繁渲染時,好比它在ListView或GridView中使用,就顯得尤其重要。html

在這節課中,將學會使用Hierachy Viewer和Layoutopt工具對佈局結構進行檢測和優化。android

檢測你的佈局

在Android SDK tools中包含一個叫作HierchyViewer工具,它能夠在你運行應用時候幫助你分析你的佈局性能。經過它你能夠發現你的佈局中性能比較差的那些地方。框架

HierchyViewer須要你選擇一個已連接的設備或者模擬器中的一個運行的線程,顯示出佈局的樹結構。每一個塊上的紅綠燈表明它的測量,佈局,以及繪圖性能,幫助你找出潛在的問題。工具

好比,圖1顯示了一個用於ListView中的Item的佈局。這個佈局的左邊顯示了一幅圖片,兩個疊在一塊兒的文字item放在右邊。那些被重複加載的佈局在優化時候顯得有爲重要。佈局

圖1. 一個ListView內item的概念設計性能

hierchyviewer 工具能夠在<sdk>/tools/中找到。當打開給工具後,就會顯示可用的設備列表一個這些設備中運行的部分。點擊「Load View Hierchy」選項查看被選中部分的佈局層次圖。好比,圖2顯示了圖1中佈局結構圖。測試

圖2. 圖1的佈局層次結構圖,使用內嵌的LinearLayout實例佈局。優化

 

圖3. 點擊層次圖中一個節點,顯示它的運行時間spa

圖2中,你能夠看到一個3層的佈局結構圖,而且在佈局text的items裏面有一些問題。點擊這些items顯示進程中每一個階段所花費的時間。它顯示的很清楚,哪些items在測試,佈局中花費時間最長,哪些地方須要花費時間去優化。命令行

使用該佈局加載全部item所花費的時間以下:

  • Measure: 0.977ms

  • Layout: 0.167ms

  • Draw: 2.717ms

修改佈局

由於上述佈局性能較低的緣由主要是由一個內嵌的LinearLayout所引發,將該佈局使用淺而廣的扁平化結構代替深而窄的樹形結構化設計,從而提升性能。在這些佈局中,將RelativeLayout做爲一個根節點,這樣,你將會看到該佈局變爲一個2層的結構,修改後的佈局以下:

圖4. 使用RelativeLayout的圖1的佈局。

修改後加載item所花費的時間:

  • Measure: 0.598ms

  • Layout: 0.110ms

  • Draw: 2.146ms

雖然看起來提升度很小,可是這佈局提升是被重複操做的,所以,這個佈局是在listview中的每個item裏面。

更多狀況的一個時間差別,是在使用了layout_weight屬性的LinearLayout設計裏面,這樣的設計會下降測量的速度。這只是一個示例說明每一個佈局是否被適當的使用,在使用layout weight屬性時候,你應該謹慎考慮是否必要。

使用Lint

這是一個好習慣,在你的佈局文件內運行Lint工具,尋找那些可能要優化的佈局結構。Lint工具代替Layoutopt工具,而且有更大的功能。以下是Lint的一些示例:

  • 使用複雜的圖片:在LineraLayout佈局中包含一個ImageView和一個TextView,可使用一個複雜的drawable代替,性能會更好。
  • 合併根框架:假如一個FrameLayout做爲一個佈局的根視圖,不提供背景或者填充,它能夠被一個帶有<merge/>標誌的佈局代替。
  • 無用的樹葉:對於一個扁平結構中一個佈局沒有孩子,沒有背景,能夠被刪掉。
  • 無用的父類:一個佈局不是ScrollView或者不是一個根佈局,也沒有背景,只有一個孩子節點,能夠被刪掉,孩子節點直接放入到這個扁平的父類裏面。
  • 深度佈局:佈局如有太多內嵌,則性能不好。考慮使用RelativeLayout 以及GridLayout等扁平化佈局代替。默認佈局最大深度是10.

使用Lint另外一個好處是,它被內嵌到ADT16+.當你在導入apk,編輯或者保存一個xml文件,Lint都會自動運行。點擊Eclipse工具欄中Lint按鈕,會人爲強制運行Lint.

在Eclipse內使用Lint,它能自動修復一些問題,爲問題提供修改建議,直接掉轉到問題代碼位置。若是你不是用Eclipse開發,也可使用命令行啓動Lint。更多信息請參照tools.android.com.

原文

http://developer.android.com/training/improving-layouts/optimizing-layout.html

相關文章
相關標籤/搜索