android-提供布局的整体性能-优化布局层次结构

来源:互联网 发布:淘宝女包品牌 编辑:程序博客网 时间:2024/04/27 17:53
现在大家有一个共同的误解那就是使用最基础的布局结构式最有效的布局方式。但是,在我们的应用里面所添加的每一个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)。通过这可以很清楚的了解到测试、布局、渲染所花费的时间,这也是我们需要花费时间优化的地方。
在这个布局里完成渲染列表控件所需要的时间为:
Measure: 0.977ms
Layout: 0.167ms
Draw: 2.717ms
###修正你的布局
由于使用嵌套的LinearLayout在布局面板上会减慢性能,通过扁平化不仅可能会提高性能——使用浅而宽的布局而非窄而深的布局。作为根节点的RelativeLayout允许这种布局,因此当页面设计转为使用RelativeLayout时,我们会发现布局变成了双层结构。通过对比可以发现新的布局如下图所示:

图4 使用RelativeLayout后图1布局的层次结构
现在的渲染时间列表如下:
Measure: 0.598ms
Layout: 0.110ms
Draw: 2.146ms
虽然这看起来只是很小的改进,但是由于这个改进会在列表中的每一个控件中使用,可以成倍的提升性能。
这次最大的不同是因为在LinearLayout的设计中使用了layout_weight,而这个会导致测试的速度变慢。这只是需要认真考虑的每个布局是否用法适当以及是否有必要使用weight这一属性的一个例子。
###使用Lint工具
使用Lint工具在布局文件中寻找可能的多层次优化方案时通常是一种很好的体验。Layoutopt已经由功能更强大的Lint替代了。Lint规则的一些例子如下:
使用混合绘制的方法——使用混合绘制的方法将会比由一个ImageView和一个TextView组成的LinearLayout更加有效率。
组合根结构——如果一个FrameLayout是在布局的根目录下并且没有背景和填充时,可以被稍微更有效的组合标签所取代。
尽量少使用叶子节点——如果一个布局没有子节点或背景同样可以被移除(因为它不可见),从而变成更扁平更有效的布局层次。
尽量少使用双亲结点——一个有孩子节点而没有兄弟节点的布局不是ScrollView或根布局,并且也没有背景,可以被移除从而让其子节点直接指向双亲结点,从而变成更扁平更有效的结构层次。
深层布局——过多的嵌套布局会对程序性能产生坏的影响。考虑使用RelativeLayout或GridLayout之类的扁平布局以提高程序性能。默认最大深度为10。

Lint的另外一个好处就是它被集成到了Android开发环境Eclipse(ADT 16+)中。当我们导出.apk文件时Lint会自动启动,并且保存和编辑XML文件。手动运行Lint工具可点击Eclipse工具栏的Lint按钮:

使用Eclipse过程中,Lint可以自动修复一些问题,可提供建议并且跳转到有问题的代码供开发者审查。如果你不是使用Eclipse作为开发工具,Lint一样可以通过命令行运行。有关Lint的更多信息请访问tools.android.com。
0 0
原创粉丝点击