Android性能优化可谓是一个老生常谈的问题,今年来随着Android应用的不断迭代,性能优化愈来愈厉害,在保证用户体验极佳的状态如何添加更多的元素使用户对应用更加满意,性能优化也就成为解决这一问题的唯一途径和手段.话不多说我们一步一步进行问题的剖析:
问题根源
- UI绘制卡顿、交互不流畅
- 内存泄露、崩溃
- 电量消耗过快
- 安装包过大
接下来我们已知的根源问题一一作出解答
UI绘制卡顿、交互不流畅
其实这个问题我们不能一味的只对布局绘制做优化,造成UI绘制卡顿、交互不流畅问题的原因主要有两方面:
- UI绘制 > UI绘制的层级太深、页面太过复杂再加上页面刷新不及时造成的
- 业务处理 > 数据处理量太大、数据放在了UI线程做处理造成的UI线程的等待、内存出现频繁GC 从而引起的卡顿.
优化方向
1.布局优化
- 使用Merge标签,减少布局层级
- 使用ViewStub标签,降低布局资源消耗提高显示效率
- 使用include标签, 对已有的布局进行复用
- 减少warp_content,它会增加布局的measure的计算成本
2.避免过度绘制
- 布局文件中的优化,移除按需显示部分之外的非须资源的引用,具体包括XML文件中非必须存在的背景、图片和Window窗口默认的背景
- 自定义View的优化,使用canvas.clipRect()帮助系统识别当前所显示的区域,只有这个区域才会被绘制.
3.合理刷新机制
- 减少UI刷新次数
- 避免后台存在高消耗的线程运行
- 缩小UI刷新区域
内存泄露、崩溃
造成内存泄露、崩溃的场景
- 错误使用单例造成内存泄露。 单例中持有的对象生命周期若比单例的生命周期短时,可能造成被持有的对象无法被释放回收,则造成内存泄露
- Handler造成的内存泄露
- 线程造成的内存泄露
- 非静态内部类创建静态实例造成的内存泄露
- 资源未关闭造成的内存泄露
- WebView引起的内存泄露
- 注册的对象使用完毕后未注销造成的内存泄露
优化方向
1.根据业务的不同合理使用对象引用的类型
- 强引用
- 软引用
- 弱引用
- 虚引用
2.减少不必要的内存开销
有效的复用资源,视图,对象池,Bitmap对象;可减少内存开销
电量消耗过快
造成电量消耗过快的场景
- 屏幕进入休眠后,后台仍有线程在执行任务
- 传感器的使用
优化方向
1.谨慎使用WakeLock
2.使用传感器选择合适的采样率,采样率越高越费电
- SENSOR_DELAY_FASTEST (0微秒)
- SENSOR_DELAY_GAME (20000微秒)
- SENSOR_DELAY_UI (60000微秒)
- SENSOR_DELAY_NOMAL (200000微秒)
3.后台注销时及时注销已注册的组件
4.使用JobScheduler
使用JobScheduler来触发一些业务,它可以推迟网络请求、数据下载、GPS定位等功能;还可以特定场景触发任务 : 连接WiFi、连接电源等场景.
网友评论