绘制优化,响应速度优化,线程优化
绘制优化
绘制优化指的是避免在View的onDraw方法中进行大量的操作。主要有两个方面:
首先,避免在onDraw方法中创建新的局部的对象,这是因为onDraw方法可能会频繁的调用,有可能在一瞬间产生大量的临时对象,这不仅会占用过多的内存,还会导致系统频繁的进行GC,影响程序的效率。
其次,不要在onDraw方法中进行耗时的操作,例如,不要有大的循环,因为耗时的操作,像是大量的循环,十分抢占CPU的时间片,导致绘制过程不流畅。
谷歌官方数据,View的绘制帧率保证60fps是最好的,也就是每一帧的绘制时间不应该高于16ms(1000ms/60=16ms)。
响应速度优化
响应速度优化的核心思想就是避免在主线程中进行耗时的操作,如果有耗时操作将耗时的操作放在子线程中执行。
响应速度更多的体现在Activity的启动速度上,如果我们在主线程中执行了过多的操作,会导致Activity启动的时候出现黑屏现象,甚至出现ANR。
Android规定,如果Activity在5s内无法响应触摸事件或者输入事件,就会出现ANR异常;BroadCastaReceiver如果在10s内无法执行完相应的操作,就会出现ANR异常。
当一个进程发生ANR以后系统会在/data/anr的目录下创建一个文件traces.txt,通过分析该文件就能定位出ANR的原因。
线程优化
线程优化的思想就是采用线程池,线程池可以重用内部的线程。采用线程池可以避免频繁的创建和销毁线程所带来的开销,同时可以控制线程的数量,避免过多的线程抢占资源引起的阻塞。因此在实际的开发中我们要尽量的采用线程池,而不是每次都创建一个Thread。关于线程池的使用,建议阅读:ThreadPoolExecutor
一些性能优化的建议
- 避免创建过多的对象
- 不要过多的使用枚举类型,因为枚举类型占用的内存比整型要大(枚举是用来构建常量数据结构的模版)
- 常量请使用static final来修饰
- 使用Android特有的一些数据结构,比如SparseArray和Pair等,他们都具有更好的性能
- 适当的使用软饮用和弱引用
- 恰当的使用磁盘缓存和内存缓存
- 尽量使用静态内部类,这样可以避免潜在的由于内部类导致的内存泄漏
ListView优化
- 采用ViewHolder并避免在getView中执行耗时的操作;
- 在滑动的时候停止异步加载图片,等到停止滑动的时候加载图片;
- 使用硬件加速;