Android常见性能优化

462 阅读2分钟


一、布局优化

二、绘制优化

三、内存泄漏优化

四、响应速度优化以及ANR日志分析

五、ListView优化(GridView)

六、Bitmap优化

七、线程优化

八、其他性能优化建议

一、布局优化

1.思路:减少布局文件的层级

1.<include>标签

2.<merge>标签

3.ViewStub:继承了View,宽高都为0,本身不参与任何布局和绘制过程。

意义:按需加载所需的布局文件,有的页面不需要整个界面初始化的时候就加载,提高程序初始化的性能。

二、绘制优化

1.View的onDraw方法要避免执行大量的操作

一是在onDraw中,不要创建新的局部对象

二是在onDraw中,不要做耗时操作,不然会导致绘制过程不流畅。

三、内存泄漏优化

1.静态内部类持有了外部类对象,导致的内存泄漏,静态变量持有当前类的对象也会造成内存泄漏。(静态成员持有外部类的对象都会造成内存泄漏)

解决办法:在外部类销毁的时候,静态变量置为空null。

2.单例模式导致的内存泄漏:单例方法中传入了Activity,但是Activity关闭的时候,单例还在引用这个activity,导致内存泄漏。

解决办法:可以使用Application的context等。

3.属性动画导致的内存泄漏

解决办法:调用cancel方法。

4.分析工具:MAT


四、响应速度优化以及ANR日志分析

1.当进程发生ANR后,都会在/daga/anr目录下生成一个traces.txt文件,分析这个ANR文件就可以定位ANR的问题。

adb pull /data/anr/traces.txt .


五、ListView优化(GridView)

1.采用ViewHolder复用控件,不会每次都new 一个对象。

2.getView中不要做耗时操作,包括其他回调方法也是不能创建对象,如getSize。

3.根据列表的滑动状态来控制更新频率

4.硬件加速。


六、Bitmap优化

1.BitmapFactory.Options来根据图片进行采样,采样过程中主要用到了 Options的inSampleSize参数。


七、线程优化

1.如果需要创建较多线程,使用线程池,减少线程创建和销毁带来的性能开销。

2.线程池还能控制最大并发数。


八、其他性能优化建议

1.避免创建过多的对象

2.不要过多使用枚举,枚举占用的内存空间要比整形的大

3.常量使用 static fianl来修饰。

4.使用一些Android特有的数据结构,如SpareArray,Pair,Parclable

5.采用内存缓存和磁盘缓存

6.尽量采用静态内部类


参考资料:《Android开发艺术探索》