一、性能优化分类
- 布局优化
- 绘制优化
- 内存泄漏优化
- 响应速度优化
- ListView优化
- Bitmap优化
- 线程优化
二、布局优化
尽量减少布局的嵌套
解决办法:
多嵌套的情况下可以使用RelativeLayout
布局层级相同的情况下使用LinearLayout,它比RelativeLayout更高效
使用<include>和<merge>标签以及<viewStub>
参考:Android布局优化之标签include,viewstub,merge
三、绘制优化
避免在onDraw中进行大量操作
解决办法:
避免在onDraw中创建新的局部对象,onDraw可能被多次调用,从而产生大量的临时对象 ,导致占用过多的内存,系统频繁gc。
避免在onDraw中进行耗时操作和大量循环操作
参考:Android性能优化:那些不可忽略的绘制优化
四、内存泄漏优化
内存泄漏:内存泄露指的是程序申请了内存以后无法释放
内存溢出:指的是申请内存,内存不足了
1.静态变量导致的内存泄漏
- 静态变量持有Activity
- 静态引用应用非静态内部类
解决办法:
在onDestroy中使静态变量为null(情况一二都适用)
创建静态内部类(适用情况二)
参考:static关键字所导致的内存泄漏问题
2.单例模式导致的内存泄漏
传入单例模式的this使得单例模式持有Activity对象
解决办法:
传入不用this,而用getApplicationContext()
3.属性动画导致的内存泄漏
属性动画有无限播放的动画,如果没有停止会一直播下去
解决办法:
在onDestroy中调用cancel()方法取消播放
4.Handler导致的内存泄漏问题
Message持有Handler的引用,因为Handler作为Activity的内部类会持有外部类的引用,当Activity finish的时候handler依旧会处理message
解决办法:
将Handler设置为静态的,静态内部类不持有外部类引用,并且如果要用到Activity的引用可以传入弱引用
5.线程导致的内存泄漏
AsyncTask或者Runnable定义为匿名内部类,会持有外部类的引用
解决办法:
设置成静态匿名内部类,采用弱引用保存Context对象
6.资源未关闭导致的内存泄漏
BroadcastReceiver,Bitmap,file,Stream,cursor等未关闭
解决办法:
及时关闭资源,BroadcastReceiver用unregisterReceiver,file、cursor,stream用close,Bitmap用recycle关闭
五、响应优化
避免在主线程中做耗时操作
六、ListView优化
复用ViewHolder类
七、Bitmap优化
先利用BitmapFactory.Options的inSampleSize属性,根据需求对图片进行采样后再加载进来。
八、线程优化
使用线程池