当前很多读者开发完成一个app可能问题不是很大了,然而应用体验比较差,卡顿现象和各种anr时有出现,用户或者是客户是非常一定没办法接受这样的android应用的,所以对应用性能优化显得尤为重要了。基于此我写了下面这篇android性能优化总结。
一、布局优化
首先,我们说android布局方式包括5种,分别是LinearLayout,RelativeLayout,FrameLayout,TableLayout及AbsoluteLayout。一般来说,LinearLayout和FrameLayout性能较好,界面绘制效率较高,能用LayoutLayout就不要用RelativeLayout。另外布局层次要尽可能少,也就说嵌套越少绘制效率越高,当使用ReLativeLayout能避免嵌套布局的情况下,我们采用RelativeLayout的布局方式,相对来说RelativeLayout的效率要高于LinearLayout这样的嵌套布局。
其次,采用include、merge及ViewStub标签。当应用使用到了多个相同的布局的时候,使用include布局将重复布局包含进来提高性能。merge配合include来使用可以去掉冗余的根布局。ViewStub用在延迟加载的场景中,比如说在网络出错的情况下加载特定的布局,可以使用setVisibility和inflate函数加载需要的布局。
二、绘制优化
绘制优化顾名思义视图中的onDraw方法尽可能的执行效率高。要尽量避免新建局部对象,要尽量避免循环操作。android绘制的标准是60fps,意思是说每秒绘制60帧界面才是流畅的,也就是尽量保证程序绘制实现在16ms以内。
三、ListView优化
首先,采用ViewHolder来替换掉控件等的重复利用。其次,根据滑动状态来对控制任务的执行频率。第三,采用硬件加速(Application,Activity,Window,View中的属性设置)来提高ListView滑动的流畅性。
四、Bitmap优化
图片加载优化一般思路是根据需要显示的图片比例也就是采样率来下载原始图片,通过BitmapFactory.option()来控制,步骤分别是:
1、BitmapFactory.options().inJustDecodeBounds 设置成true, 意思是不加载原始图片只是获取原始图片的宽和高。
2、设置采样率inSamepleSize,将需要的尺寸大小和原始图片的尺寸对比得到采样率,一般采样率定义为2的指数次方,比如,目标尺寸是100*150,原始尺寸是200*300,则采样率就是2,也就是宽和高分别缩小1/2,尺寸缩小1/4。
3、inJustDecodeBounds 设置成false
4、decodeFile() /decodeStream/decodeByteArray 加载图片到内存
五、内存泄露优化
内存泄露很多情况是由于程序员本身写代码不注意导致的,一不小心就容易出现内存溢出,程序奔溃的现象。对内存泄露的优化尤为重要。列举以下情况容易导致内存泄露:
1、静态成员变量导致Activity实例无法回收
2、非静态内部类或者匿名内部类中引用外部类的成员变量导致外部类Activity实例无法回收,尽量采用静态内部类+弱引用的方式加以避免
3、单例中持有Activity的实例对象的引用导致无法销毁,单例的生命周期等于Application的生命周期,因此单例中使用完Activity实例之后需要释放变量
4、属性动画导致的内存泄露,属性动画在使用完之后记得cancle
六、响应速度优化
应用启动过程中如果执行耗时操作则很有可能出现黑屏现在,甚至ANR。主线程操作了耗时的任务导致程序ANR(Activity如果在5秒之内无法响应屏幕触摸事件或者按键事件),这种情况可以通过查找data/anr/traces.txt文件进行anr问题排查
七、线程优化
当需要用到大量的线程时采用线程池,可以大量线程的创建和销毁所带来的性能的开销
八、其他优化建议
1、当数量级在千级以内,使用SpareArray,LongSpareArray, ArrayMap, 代替HashMap
2、使用内存缓存和磁盘缓存
3、尽量少用枚举类型,枚举类型占用内存更大
4、常量使用static final类型修饰
5、避免创建过多的对象
6、适当使用软应用和弱引用