性能优化的方法
布局优化:利用<include/>、<merge/>以及ViewStub优化
<include/>标签只支持以android:layout开头的属性,若设置了android:layout_*属性,则必须有android:layout_width(height)属性。也可设置 id,若布局也有id,以include指定的id为准。
<merge/>标签可以减少布局的层级。
ViewStub继承了View,本身不参与布局和绘制过程,用于按需加载需要的布局,如:刚开始不需要显示的控件可以用此。一旦加载后,会被内部的布局替换掉。
绘制优化:onDraw方法要避免执行大量的操作,表现为1.不要创建新的布局对象,否则会被频繁调用,产生大量临时对象,占有内存;2.不要做耗时操作。
内存泄露优化:
1.因静态变量导致的内存泄露,当静态变量引用Activity时,不能销毁。
2.单例模式导致的内存泄露,如,在单例中可以接受外部的注册并将 外部监视器储存起来,在Activity中实现接口并注册,若没解除注册,会导致OOM。单例模式的生命周期和Application一致。
3.属性动画导致的内存泄露,如,无限循环动画不在onDestory中cancel的话。
4.查询数据库没有关闭,cursor。要在finally中调用cursor.close()方法。
5. 注册服务或广播时,记得注销
6.使用文件或者访问网络资源时,忘记关闭InputStream/OutputStream。
7.Bitmap使用后未调用recycle(),尽量调用recycle()以释放资源。
响应速度优化和ANR日志分析:避免在主线程中做耗时操作。分析ANR可以在/data/anr下查看trances.txt文件,
命令:adb pull /data/anr/traces.txt
线程优化:使用线程池,避免程序中存在大量线程,可以重用内部线程,从而避免线程的创建和销毁带来的开销,并且可以有效控制线程并发数目,避免线程抢占资源而导致阻塞现象发生。
其余建议:
1.避免过多的创建对象
2.不要过多使用枚举,枚举占据内存比整形大
3.常量请使用final static 修饰
4.适当使用软引用和弱引用
5.采用内存缓存和磁盘缓存
6.尽量采用静态内部类,避免潜在的由于内部类而导致的OOM。