1.绘制优化
android view应用层绘制流程:measure-layout-draw
卡顿根本原因:绘制任务太重,绘制一帧内容耗时太长;主线程太忙,导致vsync信号来时还没有准备好数据导致丢帧。
主线程的关键职责是处理用户交互,在屏幕上绘制像素,并进行加载显示相关的数据。
主线程主要工作:ui生命周期控制;系统事件处理;消息处理;界面布局;界面绘制;界面刷新
1.1布局优化
1.1.1减少布局层级:
merge,include标签;弹性布局;合理使用布局
1.1.2 避免过度绘制:
xml布局-控件有重叠且都有设置背景;
view自绘-view ondraw里面同一个区域被绘制多次(设置-开发者选项-show gpu overdraw工具:
无色-无过度绘制,每个像素绘制1次;
蓝色-过度1次;
绿-过度两次;
淡红-过度3次;
深红-过度4次或更多)
1.2合理刷新
控制刷新频率:eg:进度条变化不足1%
避免无必要的刷新:eg:需要刷新的视图不可见;列表滚动,item上的图片加载暂停
缩小刷新区域:invalidata方法会更新整个视图,局部的刷新invalidata(Rect dirty),invalidata(left,top,right,bottom)
1.3提升动画性能
流畅度:流畅度是动画核心,控制每一帧动画在16ms内完成
内存:避免内存泄漏,减小内存开销
耗电:减小运算量,优化算法,减小cpu占用
2.内存优化
过多的使用内存会导致程序内存溢出,最终导致oom;过多的使用cpu资源,例如大量耗时任务时会照成卡顿,严重时ANR
应用在使用过程中会随着内存的暂用的增加,当到达一定条件后就会引起GC,在GC的过程中,任何线程(包括UI线程)都会暂停,此时就会引起卡顿的现象。所以频繁引起GC也会对应用的流畅性以及稳定性造成影响,
内存优化的意义:
减小OOM,提高应用稳定性
减少卡顿,提高应用流畅度
减少内存占用,提高应用后台运行时的存活率
减少异常发生,减少代码逻辑隐患
2.1优化建议
避免创建过多对象,尽量减小对象的作用域
使用整型来替代枚举
常量用static final修饰
使用android特有数据结构sparsearray pair
适当使用软引用和弱引用
内存缓存
内部类尽量使用静态,减少泄漏
注:在创建对象后,在确定不需要使用该对象时,使对象置空=null可提高内存使用效率
2.2优化内存空间
使用最小内存的