前言
正文
一般来说,Android优化可以分为三类。布局优化,内存优化,渲染优化。
布局优化
1.布局优化-减少视图层级数
首先说说布局优化,当我们拿到UI设计稿的时候,不应该盲目的就开始写,应该先想一想,我们用什么样的布局最合适。在Android4.x的时代,AndroidStudio默认将新建项目MainActivity的布局设置为一个LinearLayout,后来改成了RelativeLayout,有些同学可能没有注意过这个细节,那既然我说出来了,大家不妨想一想,为什么Google官方要做这样的替换呢?其原因当然是考虑到性能了,首先,LinearLayout会对控件测量1次,而RelativeLayout会对控件测量2次,试想,如果控件数量非常多,一个页面上百个,那么这个工作量可是有差别的,即便CPU的速度越来越快,那也是要耗时的,作为一名高级程序员,我们就要精益求精。那么问题来了,明明LinearLayout比RelativeLayout少一次,为什么还要替换呢?因为我们现在市面上的app的布局都十分花哨,有时需要层层嵌套,而相比层层嵌套,性能更优的还是测量2次,因此,如果布局用LinearLayout可以完成且嵌套层数在2层或2层以下,那么推荐用LinearLayout,因为测量的次数少一次。但是绝大多数时候,只嵌套2层完全没法满足需求,因此在布局较为复杂的时候,推荐使用RelativeLayout,减少布局嵌套的层数,可以大大的优化性能。
2.ViewStub
相信我们都遇到过这样的需求,某一个功能只对特定的人群开放,有些用户永远不可能看到该功能。面对这样的需求,新手的第一想法可能是,写一个控件,动态的setVisibility不就行了。的确,可以实现,但是,从性能的角度,并不是完美的。因为LayoutInflater在加载的时候,看到一个控件,比如Button,即便是gone的状态,也是会inflate的,会占用内存和系统资源。这种时候,一定要有限考虑使用ViewStub这个视图,它可以延迟加载,只有在你调用inflate()方法之后才会真正的加载,具体用法可以自行百度,这里不多做赘述,只讲方法。
3.使用merge标签
我们肯定使用过<include>标签来进行重复布局的引用,在这个过程中会产生冗余的父布局,可以使用merge标签来进行合并。
4.减少视图数量
注意,这跟减少视图层级不一样,这里说的是数量,举个例子,UI设计的输入框左边有一个装饰图标,那我们就不要用两个控件去写,用一个输入框,增加个drawableStart属性,引入资源即可,通过源码我们能够看到,drawableStart在EditText中仅仅是一个Drawable的引用,但是如果我们用两个控件,将大大增加开销,也许还需要增加父布局来包裹起来,性能大大降低。再比如,同一行文本,姓名:XXX,这里姓名和XXX的颜色是不一样的,我们也不要使用两个控件,使用图文混排,SpannableStringBuilder来实现前后文本不一样颜色,不一样背景,加粗,下划线等等效果,性能也是远远大于多个控件的。
内存优化
性能优化