Jetpack Compose 1,阿里 P8 架构师 Android 大厂面试题总结
=========================================================================
现行的 Andoird 开发体系:Java + xml,但近年来 Google 已经宣布 Kotlin 是 Android 开发的第一语言。Jetpack Compose 这套声明式 UI 采用的底层 DSL 是 Kotlin,即 你在使用 Jetpack Compose 开发 UI 时,实际上是使用 Kotlin 进行 UI 开发,「即 完全统一了 Android 开发语言。」
======================================================================
现行的 Andoird 视图体系属于传统的命令式开发方式:使用 XML 布局、通过 findViewById 获取控件的引用,命令式地更新状态、刷新 UI。命令式 UI 开发的特点是:
UI 可变:接受命令后通过变化自身刷新 UI
UI 持有状态 State:控件的变化通过改变自身状态实现
Jetpack Compose 使用的是声明式 UI 开发方式,其特点相对于命令式 UI 开发有较大区别:
UI 不可变 : @Composable 函数不返回任何可引用句柄,无法被外界改变;
UI 不持有 State: @Composable 函数无法持有状态,显示的数据都需要通过参数传入;
总的来说,Jetpack Compose 进行声明式 UI 开发时:
每个 UI 绘制会一个“纯函数”的方式运行;
当 状态 State 变化时函数重新执行刷新 UI。
=======================================================================
Jetpack Compose 刷新 UI 的方式叫重组,即使用新数据再次调用 UI 绘制的函数。
@Composable
fun ClickCounter(clicks: Int, onClick: () -> Unit) {
Button(onClick = onClick) {
Text("I've been clicked $clicks times")
}
}
如上述按钮设置:每次点击该按钮
时,调用方都会更新 clicks 的值。Compose 会再次调用 lambda 与 Text 函数以显示新值。
当数据变化时就会触发重组,如果每次都全量重组则会带来很多性能损耗。「类似 React 那种声明式 UI, 每次绘制时都会通过 diff 算法精准更新 DOM 从而实现局部刷新,最终保证 React 的刷新性能。」
Jetpack Compose 为了保证重组性能才使用了类似的思想:「局部刷新,也叫智能重组」。原理是:在 Gap Buffer 这样线性结构上进行 diff。
「Gap Buffer 是一个树形结构经 DFS 处理后的数组」,数组单元通过 key 标记其在树上的位置信息。Compose 在编译期为 Composable 生成带有位置信息的 key 存入到 Gap Buffer 数组的对应位置。运行时根据 key 来识别 Composable 节点是否发生了位置变化,最终决定是否参与重组。同时,「Gap Buffer 还会记录 Composable 对象关联的状态(State 或 Parameters)」:仅当关联状态变化时,Composable 才会参与重组。
============================================================================
Jetpack Compose 的 UI 变化本质是:「状态(State) 驱动」,即控件 UI 的变化原因是控件 UI 的状态发生了变化。
对于传统的 UI 开发模式,状态(State) 只是 UI 控件的一个属性,仅此而已。
=======================================================================
虽然 Jetpack Compose 1.0 才刚面世,但实际上其 UI 组件库已经十分完备,几乎完全覆盖了 Android 现有视图系统的所有组件及能力,主要包括:
基础 UI 组件,如 Button、TextView 等,连 Card、Fab、AppBar 等 Material Designe 的控件都会涵盖;
列表类组件,如 List 等,采用 items{…} 中创建每条项目的 Composalbe,避免了额外的 Adapter 适配;
布局类组件,提供了多种容器类 Composalbe,可以十分高效方便地对子组件进行布局;通过一系列链式调用的 Modifier 操作符来装饰 Composable 的外观。操作符的使用十分丰富,如 size、backgrounds、padding 等;
动画组件,同样是采用状态(State)驱动进行动画效果的实现。
=====================================================================
Jetpack Compose 能做到开发过程中的**「实时预览」**,预览机制可以做到与真机无异,真正的所见所即得。
评论