第十五章 Android性能优化
- 分为以下三部分
- 各类性能优化
- 内存泄漏
- 规范
性能优化
- 性能优化方面有:
- 布局优化
主要是减少层级
1.删除无用的控件和层级,有选择的使用性能较低的ViewGroup.如果布局中既能使用LinearLayout (或FrameLayout) 又能使用RelativeLayout(较为复杂), 那么就采用LinearLayout
. 如果是通过嵌套方式才能实现效果, 建议采用RelativeLayout
.
2.使用标签
<include>
标签:可以添加其他布局, 主要用于布局重用
<merge>
标签:一般与<include>
标签嵌套使用, 减少布局层级
<ViewStub>
标签:提供按需加载的功能.- 绘制优化
是指view的onDraw
方法要避免大量的操作
1.不要创建新的局部对象
因为onDraw方法可能会被大量频繁的调用, 从而产生大量的临时对象
2.onDraw中不要做耗时任务, 也不能执行大量的循环操作- 内存泄漏优化
写代码时注意, 并且可以使用内存泄漏分析工具
1.静态变量导致的内存泄漏
静态变量持有Activity对象. 导致Activity无法释放.
2.单例模式导致的内存泄漏
单例模式的特点是其生命周期和Application保持一致, 因此可能会造成Activity对象无法被及时释放.
3.属性动画导致的内存泄漏
属性动画中有一类无限循环动画, 如果在activity中播放此类动画而又没有在onDestory中去停止动画, 那么最终会导致activity无法释放.- 响应速度优化和ANR日志分析
响应速度优化的核心就是避免在主线程中做耗时操作. 由于Android规定:Activity
如果5秒之内,BroadcastReceiver
在10秒之内, 前者还未响应或后者还未执行完操作, 就会出现ANR.
1.发生ANR时, 系统会自动在/data/anr目录下创建一个文件traces.txt
. 通过分析这个文件就能定位出ANR的原因. 主要看tid = 1
的那段, 代表主线程的情况- Bitmap优化
1.通过BitmapFactory.Options来根据需要对图片进行采样
2.可以直接使用优秀的框架, 如facebook的fresco
.- 线程优化
使用线程池,避免程序中存在大量的Thread,
1.线程池可以重用内部的线程, 避免线程创建和销毁带来的性能开销
2.能有效控制线程池的最大并发数- 一些性能优化建议
1.避免创建过多的对象
2.不要使用过多的枚举, 枚举占据的空间比整形要大
3.常量使用static final
来修饰
4.使用一些Android 持有的数据结构, 比如SparseArray和Pair等,
5.适当使用软引用和弱引用
6.尽量使用静态内部类. 避免潜在由于内部类导致的内存泄漏.
内存泄漏分析工具(MAT)
- 根据实际的项目来进行分析(P502)
代码的可维护性和可扩展性
- 相关方面
- 命名规范
- 代码排版
- 仅为关键代码添加注释
- 代码的层次性和单一职责