课程名称:BAT大牛亲授技能+技巧 Android面试快速充电升级
课程章节:Android基础相关面试问题
主讲老师:DocMike
课程内容
人们眼睛所能感觉到最大帧数就是60帧,高于60帧以上人们的视觉无法感觉,但是低于60fps时用户能够感觉到不顺畅,也就是有些卡顿,所以说16ms就是每一次渲染的最大时间。为了保证UI的流畅性,程序的大多操作都需要在16ms内完成。
Android 系统也会每隔16ms发出信号,进行UI的渲染,如果每次渲染都成功,则用户就可以看到流畅的画面。
UI 卡顿原因分析
- 人为在 UI 线程中做轻微耗时的操作,导致 UI 线程卡顿;
- 布局 Layout 过于复杂,无法在 16ms 内完成渲染;
- 同一时间动画执行的次数过多,导致 CPU 或 GPU 负载过重;
- View 过渡绘制,导致某些像素在同一帧时间内被绘制多次,从而使 CPU 或 GPU 负载过重;
- View 频繁的触发 measure()、layout()、导致 measure、layout 累计耗时过多,以及整个 View 频繁的重新渲染;
- 内存频繁触发 GC 过多,造成内存抖动,导致暂时阻塞渲染操作;
- 冗余资源及逻辑等导致加载和执行缓慢;
- ANR
UI 卡顿总结
- 布局优化,避免 layout 嵌套过多;尽量使用 View.GONE 代替 View.INVISIBLE,因为 View.INVISIBLE 虽然不可见,但是也是要完成 measure 和 layout 的过程;合理使用 merge 标签,在布局很复杂的时候可以考虑使用自定义控件。
- 列表及 Adapter 优化,主要体现在 ListView 和 RecyclerView,尽量复用 Item,而不是每次都去填充渲染,在滑动的时候避免加载图片等。
- 背景和图片等内存分配优化,避免对一个像素点进行多次的渲染,在开发阶段,可以通过开发选项中的过渡绘制功能查看,级别按照从高到底的顺序依次是红黄绿蓝。
- 避免 ANR,避免在主线程中做耗时的操作。
课程收获
这一节介绍了造成 UI 卡顿的原因,app 的卡顿直接影响用户的体验,在实际的开发场景中,面对可能造成卡顿的问题可能会更复杂。UI 卡顿的根本原因就是 UI 线程无法在 16ms 内完成 UI 的绘制,可以借助一些三方的监测工具,辅助我们来排查问题。