一.布局优化
1.app里的每一个view,android系统都会经过三部曲来渲染:measure,layout,draw。measure从最顶部的节点开始,顺着layout树形结构依次往下,测量每个view需要在屏幕当中展示的尺寸大小,节点所处位置越深,套嵌带来的measure越多,计算就会越费时
2.HierarchyViewer和lint工具
(1)HierarchyViewer
http://mrpeak.cn/android/2016/01/11/android-performance-ui
(2)lint的使用:
①作用:找出项目中不规范的编码、多余的资源、可能的bug、可能出现内存泄漏的地方或者其它的一些问题,然后会给出修改的建议供我们参考,
虽然这些问题并不会影响App的正常运行,不过这对于项目的规范性和维护性来说是非常重要的。
②使用:
Analyze->Inspect Code->选择范围点击OK
3.布局优化措施:
(1)include标签
优点:重用布局,做代码优化
缺点:可能会导致产生多余的布局嵌套
(2).merge标签
merge标签是为了解决include标签导致的多余的布局嵌套
最外层的LinearLayout/RelativeLayout布局删除掉,换用了<merge>标签,这就表示当有任何一个地方去include这个布局时,
会将<merge>标签内包含的内容直接填充到include的位置,不会再添加任何额外的布局结构
(3).ViewStub:
1)对于功能:对于一个布局的一部分,我们需要控制他的隐藏跟显示
我们一般的做法是设置它为GONE但是将元素进行隐藏,它们其实还是在布局当中的,解析布局的时候还是回将这些布局一一解析出来
我们使用ViewStub可以实现不常用的元素在需要时被加载,它没有大小,没有绘制功能,也不参与布局,资源消耗非常低,
将它放置在布局当中基本可以认为是完全不会影响性能的。
2)ViewStub如何使用?
把需要被隐藏的布局单独放到一个layout布局文件中,然后用ViewStub标签加载
<ViewStub
android:id="@+id/viewstub_demo"
android:layout="@layout/viewstub_test"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
//一旦ViewStub中指定的布局加载之后,这个id也就失败了
//ViewStub只能Inflate一次,之后ViewStub对象会被置为空
viewstub_demo= (ViewStub) findViewById(R.id.viewstub_demo);
public void onClick(View v) {
if(viewstub_demo!=null){
//使用inflate()方法或者setVisibility(View.VISIBLE)都可以讲布局加载出来
View view=viewstub_demo.inflate();
EditText et_name= (EditText) view.findViewById(R.id.et_name);
}
}
PS:ViewStub所加载的布局是不可以使用<merge>标签的,因此这有可能导致加载出来的布局存在着多余的嵌套结构,具体如何
去取舍就要根据实际情况来决定了,对于那些隐藏的布局文件结构相当复杂的情况,使用ViewStub还是一种相当不错的选择的
(4).尽量使用LinearLayout来代替RelativeLayout
RelativeLayout分别onMeasure()中对所有子View进行两次measure,横向纵向分别进行一次。
而LinearLayout只有一次
(5)减少不必要的infalte
对于inflate的布局可以直接缓存,用全部变量代替局部变量,避免下次需再次inflate
(6)去除不必要的嵌套和View节点,Constraint Layout解决布局嵌套问题
Constraint Layout的使用:www.jianshu.com/p/a8b49ff64cd3
(7).Fragment的优化:
考虑放弃Fragment常驻内存的方案,不使用hide()和show()对Fragment进行控制,改用replace()等方案