2、分析Systrace报告
使用Chrome打开文件后,其中和UI绘制关系最密切的是Alerts和Frame两个数据:
-
Alerts:标记了性能有问题的点,单击该点可以查看详细信息,右侧的Alerts框还可以看到每个类型的Alerts的数量。
-
Frame:每个应用都有一行专门显示frame,绘制正常时每一帧就显示为一个绿色的圆圈。当显示为黄色或者红色时,则表明它的渲染时间超过了16.6ms。
最后,这里再列出在Systrace便于操作的快捷键:
-
W:放大
-
S:缩小
-
A:左移
-
D:右移
========================================================================
-
合理使用RelativeLayout和LinearLayout。
-
合理使用Merge。
合理使用RelativeLayout和LinearLayout
RelativeLayout也存在性能低的问题,原因是RelativeLayout会对子View做两次测量。但如果在LinearLayout中有weight属性,也需要进行两次测量,但是因为没有更多的依赖关系,所以仍然会比RelativeLayout的效率高。
注意
由于Android的碎片化程度很高,所以使用RelativeLayout能使构建的布局适应性更强。
合理使用Merge
merge的原理:在Android布局的源码中,如果是Merge标签,那么直接将其中的子元素添加到Merge标签Parent中。
注意
-
1、Merge只能用在布局XML文件的根元素。
-
2、使用merge来加载一个布局时,必须指定一个ViewGroup作为其父元素,并且要设置加载的attachToRoot参数为true。
-
3、不能在ViewStub中使用Merge标签。原因就是ViewStub的inflate方法中根本没有attachToRoot的设置。
ViewStub是一个轻量级的View,它是一个看不见的,并且不占布局位置,占用资源非常小的视图对象。可以为ViewStub指定一个布局,加载布局时,只有ViewStub会被初始化,然后当ViewStub被设置为可见时,或是调用了ViewStub.inflate()时,ViewStub所指向的布局才会被加载和实例化,然后ViewStub的布局属性都会传给它指向的布局。
注意:
-
1、ViewStub只能加载一次,之后ViewStub对象会被置为空。所以它不适用于需要按需显示隐藏的情况。