简介:
布局优化
- 在布局中尽可能减少嵌套,因为嵌套相当于增加了布局的层级,增加了绘制的开销。
- 在相同的布局中使用
标签,可以重用布局 - 如果被
标签包含的布局和父布局是一样的,那么可以使用 标签用来减少布局的层级 - 在初始化的时候可以使用ViewStub来按需加载布局
- 通过设备的开发者模式打开布局开关可以看到布局渲染重叠的程度
绘制优化
- onDraw()方法不要创建新的局部对象,因为onDraw()方法可能频繁调用,导致产生大量临时对象占用内存
- onDraw()方法不要做耗时操作,保证view的绘制过程不超过16ms
内存优化
- 不要使用静态变量持有context,会导致Activity无法释放
- 单例模式注意不要持有context,会导致Activity无法释放
- 频繁做字符串操作时,使用StringBuilder或StringBuffer代替String,因为String会不停生成对象占据空间
- 属性动画需要注意停止动画,否则view会一直被动画持有,而view又持有Activity导致无法释放
- 使用数据库操作时注意游标cursor需要及时关闭
- 操作文件数据时输入输出流InputStream/OutputStream记得关闭
- Bitmap使用后需要调用recycle()释放图片资源
- 大图片使用BitmapFactory.Option对图片进行采样压缩
- adapter使用缓存contentview来减少对象创建
- 使用观察者模式注册对象时需要注意取消注册
- 适当使用软引用和弱引用
- 使用线程池来复用线程
响应优化
- 在主线程进行耗时操作时会触发ANR,Activity为5秒,BroadcastReceiver为10秒,避免在主线程处理耗时过长的任务,使用Thead,Handler,AnsyTask等都可以。
时间消耗测试
通过System.currentTimeMillis()获取时间进行计算
内存消耗测试
public class Memory{
public static long used(){
long total = Runtime.getRuntime().totalMemory();
long free = Runtime.getRuntime().freeMemory();
return (total - free);
}
}
在程序片段之间通过调用used()方法测出消耗内存数
使用工具
- Hierarchy Viewer
用来观察布局的层级 - TraceView
分析方法调用栈以及其执行时间, 优化方法执行 - Memory Monitor
用来做内存分析 - Square的leakcanary
第三方用来检测内存泄漏的库