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


優化布局層次結構

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

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

檢測你的布局

在Android SDK tools中包含一個叫做HierchyViewer工具,它可以在你運行應用時候幫助你分析你的布局性能。通過它你可以發現你的布局中性能比較差的那些地方。

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

比如,圖1顯示了一個用於ListView中的Item的布局。這個布局的左邊顯示了一幅圖片,兩個疊在一起的文字item放在右邊。那些被重復加載的布局在優化時候顯得有為重要。

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

hierchyviewer 工具可以在<sdk>/tools/中找到。當打開給工具后,就會顯示可用的設備列表一個這些設備中運行的部分。點擊“Load View Hierchy”選項查看被選中部分的布局層次圖。比如,圖2顯示了圖1中布局結構圖。

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

 

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

圖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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM