android 性能优化

android性能优化在实际开发中会经常应用到,当项目越来越庞大时,性能优化就显得更加重要,写出高性能优化代码不但需要丰富的经验,而且还需要了解其原理,这样才有助于我们写出高性能的代码,今天我们来总结一下日常开发中常用性能优化方案,看看你都熟悉哪些。
android性能优化包括:布局优化、绘制优化、内存泄漏优化、响应速度优化、listview优化、Bitmap优化、线程优化等。

布局优化

尽量减少布局层级,relativeLayoutLinearLayout的性能差,relativeLayout的性能优于嵌套布局,布局优化的另外一个手段就是采用<include><merge>标签和ViewStub,<include>标签主要用于布局重用,<merge>标签一般和<include>标签去配合使用,它可以降低减少布局的层级,而ViewStub则提供了按需加载的功能,当需要时才会将ViewStub中的布局加载到内存中,这提高了程序的初始化效率。

绘制优化

绘制优化指View的onDraw方法要避免执行大量的操作,这主要体现在两个方面:
(1)onDraw方法中不要创建新的局部对象,因为onDraw方法可能被频繁的调用,这样一瞬间会产生大量的临时对象,这些对象不仅占用了过多的内存,而且还会导致系统频繁的gc,降低了程序的执行效率。
(2)onDraw方法中不要执行耗时任务,也不能执行成千上万次的循环操作,大量的循环十分抢占CPU的时间片,这会造成view的绘制过程不流畅。

内存泄漏优化

内存泄漏优化分为两个方面:

(1)避免写出内存泄漏的代码、
(2)通过分析工具,比如MAT来找出潜在的内存泄漏继而解决。

内存泄漏场景:

(1)静态变量导致的内存泄漏
(2)单例模式导致的内存泄漏
(3)属性动画导致的内训泄漏:属性动画中有一种无限循环的动画,它持有ActivityView的引用,而View又持有Activity,这样就导致Activity已经不显示了,但是仍然销毁不掉,解决方案就是在ActivityonDestroy()方法中将动画停止。

响应速度优化

避免在主线程中去做耗时操作,Activity如果5s没有响应,则会出现ANR,BroadcastReceiver如果
10s还未执行完操作也会出现ANR

ListView和Bitmap优化

listView优化主要分为三个方面:

(1)使用ViewHolder并避免在getView方法中执行耗时操作
(2)根据列表的滑动状态来控制任务的执行频率,比如当列表快速滑动时不适合开启大量的异步任务,
(3)使用硬件加速来使listView的滑动更加流畅

Bitmap优化:

主要是通过BitmapFactory.Options来根据需要对图片进行采样,采样的过程主要使用到了BitmapFactory.Options
来根据需要对图片进行采样,采样的过程主要使用到了BitmapFactory.OptionsinSampleSize参数

线程优化

线程优化的思想是采用线程池,避免程序中存在大量的Thread。线程池可以重用内部的线程,从而避免了线程的创建和销毁带来的性能开销,同时线程池可以有效的控制线程的最大并发数,避免了大量线程因互相抢占系统资源而导致阻塞现象的发生。因此在实际开发中应尽量采用线程池,而不是每次都要创建一个Thread对象。

一些性能优化的建议

(1)避免创建过多的对象
(2)不要过多的使用枚举类型,枚举占用的内存空间比整型要大
(3)常量请使用static final来修饰
(4)使用一些android也有的数据结构,如SparseArrayPair
(5)适当的使用软引用和弱引用
(6)采用内存缓存和磁盘缓存
(7)尽量采用静态内部类,这样可以避免潜在的由于内部类而导致的内存泄漏的问题