android性能优化

简介:

这里简单介绍下android性能优化的一些方法

布局优化

  • 在布局中尽可能减少嵌套,因为嵌套相当于增加了布局的层级,增加了绘制的开销。
  • 在相同的布局中使用标签,可以重用布局
  • 如果被标签包含的布局和父布局是一样的,那么可以使用标签用来减少布局的层级
  • 在初始化的时候可以使用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
    第三方用来检测内存泄漏的库