一个广泛的误解就是,使用基本的布局结构会产生高效的布局性能。然而每个添加到应用的控件和布局,都须要初始化,布局位置和绘制。好比,使用一个嵌套的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工具代替Layoutopt工具,而且有更大的功能。以下是Lint的一些示例:
使用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