android性能优化
2020-12-05 本文已影响0人
Ivy枫
android程序过多的使用内存会造成内存溢出(OOM),过多的使用CPU资源(一般指大量的耗时工作),会导致卡顿或ANR
性能优化方法:布局优化、绘制优化、内存泄漏优化、响应速度优化、ListView优化、Bitmap优化、线程优化等
布局优化
思想:减少布局的层级,意味着android的绘制工作量少了
- 删除布局中无用的控件和层级,有选择的使用性能较低的ViewGroup,**FrameLayout和LinearLayout是简单高效的ViewGroup,RelativeLayout功能复杂,建议少用,尽量不用
- 采用include标签、merge标签和ViewStub,include标签用于布局的重用,merge与include配合使用,可以降低减少布局的层级,ViewStub提供按需加载功能
绘制优化
指View的onDraw方法要避免执行大量的操作
- onDraw中不要创建新的局部对象,因为可能onDraw方法可能会被频繁的调用,这样会产生大量的临时对象,占用过多的内存,频繁的gc,降低程序的执行效率
- 在onDraw中不要做耗时的工作,View的绘制帧率保证在60fps最佳,要求每帧的绘制时间不超过16ms
内存泄漏优化
可以使用MAT工具来找出潜在的内存泄漏,从而解决问题,内存泄漏不会导致程序功能异常,但容易造成内存溢出
静态变量导致的内存泄漏、单例模式导致的内存泄漏、属性动画导致的内存泄漏
单例模式的生命周期与Application保持一致,在属性动画中有一类无线循环动画,在activity中没有停止的话会一直循环播放下去,即使看不见,activity的View会被动画持有,View又持有Activity,最终activity无法释放
响应速度优化
核心思想:在主线程中不要做耗时的工作
activity在5秒之内无法响应屏幕的触摸事件或者键盘输入事件就会ANR,BroadcastReceiver在10之内没有执行完成会出现ANR
线程优化
主要思想:采用线程池,避免程序中存在大量的Thread
线程池可以重用内部的线程,从而避免了创建和销毁线程带来的性能开销,线程池还能有效的控制线程池的最大并发数,避免大量的线程因为互相抢占资源从而造成堵塞现象
性能优化总结
- 避免创建过多的对象
- 不要过多使用枚举,枚举占用内存比整型大
- 常量使用static final
- 使用android特有的数据结构,如:SparseArray和pair
- 适当使用软引用和弱引用
- 采用内存缓存和磁盘缓存
- 尽量采用静态内部类,可以避免潜在的内部类而导致的内存泄漏