关于安卓性能的优化,根据任玉刚老师的android的艺术探索中整理的,感觉在面试中用处还是很大的,希望对大家能有所帮助。
1.1 为什么要性能优化?
android是一种一动设备,不可能像pc端那样具有超大的内存和高性能的cpu,
这也就意味着android不可能无限制的使用内存和cpu资源,过多的使用内存,会导致内存溢出
即OOM,过多的使用cpu相当于做大量的耗时操作,这样会导致手机卡顿,出现程序无响应,
所以我们需要性能上的优化;
1.2 性能优化可以从:
1)布局上进行优化;
2)绘制上进行优化
3)内存泄露优化
4)响应速度优化
5)listview优化
6)bitmap优化
卓一讲解:
2.1 安卓布局上的优化
布局优化的思想就是减少布局文件的层级,布局的层级越少,android绘制的工作量就少。
性能自然就高。
如果布局中既可以使用linearLayout和relativeLayout,那么采用linearLayout,
原因:relativeLayout功能比较复杂,他的布局过程会耗费更多的cpu时间。
如果需要使用嵌套方式来完成任务我们需要采用relativeLayout,
手段二:
我们可以采用安卓布局中的标签:
include标签主要用于布局的重用,一般和merge配合使用,从而减少布局的层级
viewStub 按需求加载布局,提高程序的初始化效率
viewStub:
继承了view,轻量级的且宽高都是0.本身不参与任何布局和绘制过程,
意义:按需求加载所需要的布局
eg: 网络异常时,将异常的页面加载出来;
通过
两种方式进行:
1)通过隐藏显示的方式(setVisibility)
2)通过infalte进行加载;
通过上面的两种方式,viewStub就会被内部的布局替换掉。
2.2 绘制优化
绘制优化是指view的onDraw方法避免大量的操作,
1)不要在ondraw中创建新的局部对象,这样onDraw就会被频繁调用,产生大量的临时对象,
占用过多内存导致系统频繁GC,降低执行效率
2)onDraw中不要做耗时操作,否则抢占CPU的时间片,造成view的绘制过程不流畅,要求每帧
绘制时间尽量不能超过16ms,
2.3 内存泄露优化
内存泄露的优化分为两方面:
避免写出内存泄露的代码,
通过MAT工具分析潜在的内存泄露进行解决
场景一:
静态变量导致内存泄露
场景二:
属性动画导致的内存泄露
android3.0开始,goole提供了属性动画,属性动画中有一类无限循环的动画,如果在activty中播放
没有在ondestory中进行停止,这个动画会一直播放下去,所以在onDestroy中调用animator.canael()来停止动画
2.4 listview和bitmap的优化
listview,复用convertView,减少findViewByid
采用ViewHolder避免在getView中执行耗时任务
bitmap 主要通过BitmapFactory.Options对图片进行采样,
2.5 线程优化
线程优化的思想就是线程池,避免大量的创建thread,线程池可以重用内部的线程,从而避免了线程
的创建和销毁所带来的性能开销,线程池控制最大并发数,避免大量的线程抢占资源从而导致堵塞现象,
3.1 关于性能优化上的一些小建议
1)避免创建过多的对象
2)常量请使用static final 来修饰
3)适当的使用软引用和弱引用
4)采用内存缓存和磁盘缓存
5)尽量使用静态内部类,避免由内部类导致的内存泄露