Android性能优化

什么是性能

快,稳,省,小,这四点很形象的代表了性能的四个方面,同时也让我们知道我们App现在是否是款性能良好的APP,如果有一项不达标,那么说明我们的应用有待优化。

很多时候我们注重功能实现,保证能用,但是我们会发现,这样的应用很难拿的出手,里面的槽点太多了,性能很差,但是又不知道从哪里下手进行优化,那么我们就一步一步来,看看我们到底应该怎么优化我们的APP

布局优化

和UI相关的首先就是布局,特别是在开发一些复杂界面的时候,通常我们都是采用布局嵌套的方法,每个人的布局思路不太一样,写出的也不太一样,所以就可能造成嵌套的层级过多。多嵌套的小隔断间需要处理,都会占用cpu计算的时间和GPU渲染的时间。

1.如果父控件有颜色,也是自己需要的颜色,那么就不必在子控件加背景颜色.

2.如果每个自控件的颜色不太一样,而且可以完全覆盖父控件,那么就不需要再父控件上加背景颜色

3.尽量减少不必要的嵌套

4.能用LinearLayout和FrameLayout,就不要用RelativeLayout,因为RelativeLayout控件相对比较复杂,测绘也想要耗时。

5.针对嵌套布局,谷歌也是陆续出了一些新的方案。对就是include、merge和ViewStub三兄弟。

5.1
include可以提高布局的复用性,大大方便我们的开发,有人说这个没有减少布局的嵌套吧,对,include确实没有,但是include和merge联手搭配,效果那是杠杠滴。

5.2
merge的布局取决于父控件是哪个布局,使用merge相当于减少了自身的一层布局,直接采用父include的布局,当然直接在父布局里面使用意义不大,所以会和include配合使用,既增加了布局的复用性,用减少了一层布局嵌套。

5.3
ViewStub它可以按需加载,什么意思?用到他的时候喊他一下,再来加载,不需要的时候像空气一样,在一边静静的呆着,不吃你的米,也不花你家的钱。等需要的时候ViewStub中的布局才加载到内存,多节俭持家啊。对于一些进度条,提示信息等等八百年才用一次的功能,使用ViewStub是极其合适的。这就是不用不知道,一用戒不了。

6.减轻onDraw()的负担

Android系统每隔16ms发出VSYNC信号,触发对UI进行渲染,但是渲染未必成功,如果成功了那么代表一切顺利,但是失败了可能就要延误时间,或者直接跳过去,给人视觉上的表现,就是要么卡了一会,要么跳帧。

View的绘制频率保证60fps是最佳的,这就要求每帧绘制时间不超过16ms(16ms = 1000/60),虽然程序很难保证16ms这个时间,但是尽量降低onDraw方法中的复杂度总是切实有效的。

6.1
onDraw方法中不要做耗时的任务,也不做过多的循环操作,特别是嵌套循环,虽然每次循环耗时很小,但是大量的循环势必霸占CPU的时间片,从而造成View的绘制过程不流畅。

6.2
除了循环之外,onDraw()中不要创建新的局部对象,因为onDraw()方法一般都会频繁大量调用,就意味着会产生大量的零时对象,不进占用过的内存,而且会导致系统更加频繁的GC,大大降低程序的执行速度和效率。

其实这两点在android的UI线程中都适用。