Android 应用启动慢,使用时经常卡顿,是非常影响用户体验的,应该尽量避免出现。 卡顿的场景有很多,按场景可以分成 4 类:UI 绘制、应用启动、页面跳转、事件响应,如 图 2-1 所示。在这四种场景下又有多个小分类,基本上覆盖了卡顿的各个场景。
这 4 种卡顿场景的根本原因又可以分成两大类。
-
界面绘制:主要原因是绘制的层级深、页面复杂、刷新不合理,由于这些原因导致卡顿 的场景更多出现在 UI 和启动后的初始界面以及跳转到页面的绘制上。
-
数据处理:导致这种卡顿场景的原因是数据处理量太大,一般分为三种情况,一是数据 处理在 UI 线程(这种应该避免),二是数据处理占用 CPU 高,导致主线程拿不到时间片, 三是内存增加导致 GC 频繁,从而引起卡顿。
- 卡顿的根本原因
- 那卡顿的根本原因是什么呢,从 Android 系统的显示原理中可以看到,影响绘制的根本 原因有以下两方面:
- 绘制任务太重,绘制一帧内容耗时太长。
- 主线程太忙了,导致 VSync 信号来时还没有准备好数据导致丢帧。
耗时太长,需要从 UI 布局和绘制上来具体分析,详见后面内容。这里我们主要讨论下 第二个方面。我们知道所有的绘制工作都是由主线程,也就是 UI 线程来负责,主线程的关 键职责是处理用户交互,在屏幕上绘制像素,并进行加载显示相关的数据。在 Android 应用 开发中,特别需要避免任何阻碍主线程的事情,这样应用程序才能保持对用户操作的即时响 应。
- UI 生命周期控制
- 系统事件处理
- 消息处理
- 界面布局
- 界面绘制
- 界面刷
除了这些以外,尽量避免将其他处理放到主线程中,特别是复杂的数据计算和网络请求。