現在大家有乙個共同的誤解那就是使用最基礎的布局結構式最有效的布局方式。但是,在我們的應用裡面所新增的每乙個widget和layout都需要初始化、布局和繪製。如巢狀使用linearlayout例項可能會導致檢視層級過深。更壞的是使用layout_weight這個引數多次巢狀linearlayout可能會讓各個子模組付出執行兩次的昂貴代價。這在多次布局填充時尤為重要,如使用listview 或者gridview。
通過這一課的學習,我們可以學著使用檢視層次和layoutopt工具去檢測和優化我們的布局。
android sdk工具中有一種叫hierarchy viewer的工具可以讓我們在應用程式執行時分析布局。使用這個工具可以幫助我們發現布局工作的瓶頸。hierarchy viewer是通過允許我們在連線著的裝置或模擬器上選擇正在執行的程序來工作的,從而顯示在布局樹上。各個板塊的訊號燈分別代表此工具的方法、布局以及效能繪製,幫助我們分析潛在的問題。 例如,如圖1使用了乙個控制項在listview中。這個布局顯示乙個小的bitmap影象在左邊,右邊有兩個文字框。這在多次填充之時尤為重要,比如下例——通過優化效能優勢可能倍增。
圖1 在listview乙個控制項布局的概念
hierarchyviewer工具在「/tools/」目錄下是可用的。當其開啟時,可以顯示可用裝置和正在執行元件的列表。點選* load view hierarch* 檢查所選元件層次結構。如圖2是的圖1中各個元件的說明。
圖2 圖一中巢狀使用linearlayout布局的布局層次
圖3 點選乙個層次節點,可以看到其所展現的樣子
在圖2中我們可以看到連線很多關係線(problems laying out,不是很確定,如果有高手請給指點一下)的文字框呈現三個層級。點選各個控制項可以顯示程序的每一步時間花費情況(圖3)。通過這可以很清楚的了解到測試、布局、渲染所花費的時間,這也是我們需要花費時間優化的地方。
在這個布局裡完成渲染列表控制項所需要的時間為:
由於使用巢狀的linearlayout在布局面板上會減慢效能,通過扁平化不僅可能會提高效能——使用淺而寬的布局而非窄而深的布局。作為根節點的relativelayout允許這種布局,因此當頁面設計轉為使用relativelayout時,我們會發現布局變成了雙層結構。通過對比可以發現新的布局如下圖所示:
圖4 使用relativelayout後圖1布局的層次結構
現在的渲染時間列表如下:
雖然這看起來只是很小的改進,但是由於這個改進會在列表中的每乙個控制項中使用,可以成倍的提公升效能。
這次最大的不同是因為在linearlayout的設計中使用了layout_weight,而這個會導致測試的速度變慢。這只是需要認真考慮的每個布局是否用法適當以及是否有必要使用weight這一屬性的乙個例子。
使用lint工具在布局檔案中尋找可能的多層次優化方案時通常是一種很好的體驗。layoutopt已經由功能更強大的lint替代了。lint規則的一些例子如下:
lint的另外乙個好處就是它被整合到了android開發環境eclipse(adt 16+)中。當我們匯出.apk檔案時lint會自動啟動,並且儲存和編輯xml檔案。手動執行lint工具可點選eclipse工具欄的lint按鈕:
布局的優化
從系統建立檢視的原理分析,系統在建立任何乙個layout時,都會在之前建立乙個framelayout,因此,如果我們要建立乙個framelayout時,其實在試圖建立上可以看到,其實是建立了乙個framelayout下,再建立乙個framelayout,為此 就增加了很多不必要的浪費。在這裡 我們就...
Android布局優化
android布局一般是xml布局,然後呼叫setcontentview 方法,雖然這個呼叫很簡單,讓我們具體看一下setcontentview 方法的具體工作步驟 1 android讀取應用的資源資料 apk檔案內,儲存在內部儲存器或sd卡中 2 解析資源資料,展開布局 3 布局展開成為activ...
android 布局優化
主要用到三個標籤。1 include 用於重複使用某個布局,減少 的重複。2 merge 用於減少布局的巢狀的層數。當父布局與子布局的根節點使用的是相同的布局,並且用include來包括進父布局中。那麼這個時候可以使用merge來替代掉原來的自布局的根節點。舉個栗子 xmlns android an...