在说性能优化之前,我们必须了解为什么要做性能优化,首先第一点肯定是为了用户体验,你想啊要是你的App用起来很卡,页面加载慢腾腾的,用户能一直忍受你吗?其二性能优化也是对我们程序员自己的考验,优化过程需要我们掌握很多的东西,比如说Java的内存模型,垃圾回收机制,Dalvik和Art虚拟机,Android底层等等等等知识,还有很多工具的使用,这章主要记录一些UI优化方面的东西。
UI优化主要的目的是为了让页面更加流畅,大家都知道Android系统每隔16ms发出垂直同步(VSYNC)信号,触发对UI的渲染,如果每次都在16ms内渲染成功,达到流畅的画面所需要的60fps(表示60桢每秒),那用户就不会感觉到页面的卡顿,
如果页面在16ms内还没有绘制完,就会出现丢帧现象,还是显示的上一桢页面,给人感觉卡住了一样,
所以我们优化要做的事情就是尽量让页面在16ms内绘制完,解决这种过度绘制的问题,下面我们就具体说说怎么解决这个问题。
我们的App都是有很多页面,首先得找到要优化的页面,这里我推荐使用两个工具,一个是手机自带的显示过度绘制区域的功能,我用的魅族手机是在开发者选项里面的,另一个是Android Studio自带的工具Lint,我个人更喜欢用手机自带的这个工具,比较直观的显示页面的绘制情况,在开启这个功能后页面显示如下图,
App的每个页面的控件都会加上额外的图层,总共4种颜色,代表4种绘制的级别,如下图,
其中红色代表的是最严重的过度绘制,从上面依次减弱,我们要做的就是修改这些区域,让它达到蓝色这种级别。通过使用这个工具,我们能很快的找到需要修改的页面。
在找到这个页面后,接下来我们就得分析是什么原因导致这个页面过度绘制,在这里我们还得使用一个工具Hierarchy View,它可以把整个页面中每个控件的所占区域用矩形标示出来,并计算出每个控件在测量布局和绘制所花费的时间,而且过度绘制的控件会用红色的圆圈标出来,至于怎么使用这个工具可以看这篇文章,通过这个工具我们可以把问题具体到某个控件上面,接下来就是解决这个控件的过度绘制问题了,在这里提供几个解决的思路:
1,减少页面的布局层次结构。
2,减少不必要的背景图片或背景颜色。
3,减少View的更新次数,比如调用View的requestLayout或者invalidate,setVisiable等等方法,都会导致View重新绘制。
4,尝试使用Android系统提供<include><merge><viewstub>等标签,不要把一大堆控件放在同一个xml布局文件里面。
5,尝试使用RecyclerView代替ListView吧,RecyclerView还能与实现嵌套滑动接口的控件做各种交互。
总结,把自己遇到的问题写出来,给自己提个醒,也希望能给一些人提供一个思路。
参考:
http://www.jianshu.com/p/e9e05ce5b0c9,
http://www.csdn.net/article/2015-01-20/2823621-android-performance-patterns