在一次项目开发中接触到了jetpack Compose,并且还项目中在逻辑简单的页面,使用了compose去实现。当时觉得很新颖,实践中也感觉到,这种响应式的,与当时的Vue/微信小程序/Flutter中思想大同小异,可能是未来的一种原生写UI的趋势。在现在的每记和脚印项目中,新实现的页面,都会优先考虑用Compose去实现。然而,Compose的一些性能优化点及注意点,也是做为开发人员需要熟悉的,今天将做一个小的总结。
一、声明式 vs 指令式编程
1、定义
无论是官网文档还是介绍Compose的优点时,都会说到Compose是声明式的。我们来回顾下,在wiki上有着如下定义:
声明式编程(英语:Declarative programming)或译为声明式编程,是对与命令式编程不同的编程范型的一种合称。它们建造计算机程序的结构和元素,表达计算的逻辑而不用描述它的控制流程。
指令式编程(英语:Imperative programming);是一种描述电脑所需作出的行为的编程范型。几乎所有电脑的硬件都是指令式工作;几乎所有电脑的硬件都是能执行机器语言,而机器代码是使用指令式的风格来写的。
通俗的来说就是:声明式编程是一种把程序写成描述结果的形式,而不是如何获得结果的形式。它主要关注结果,而不是实现细节。声明式编程的代码通常更简洁,更容易理解和维护。
命令式编程则是一种把程序写成指令的形式,告诉计算机如何实现结果。它更加关注细节,如何实现任务。命令式编程的代码通常更长,更难理解和维护。
2、个人理解
Compose其实就是UI框架,它最主要的功能就是让开发人员更加快速的实现 页面逻辑&交互效果 这是目的。
对于传统的XML来说,我们通过请求去服务器获取数据,请求成功后,我们需要findViewById
找到页面元素View,再设置View的属性,更新页面展示状态。整个过程是按 http请求 -> 响应 -> 寻找对应View -> 更新对应View
按部就班就地执行,这种思想就是命令式编程。
但是Compose描述为 http请求 -> 响应 -> 更新mutableData -> 引用对应数据的View自动重组
,整个过程不需要我们开发去写更新UI的代码(发出命令),而是数据发生改变,UI界面自动更新,可以理解为声明式。
二、Compose优势
目前对于我的体验感受来说,Compose的优势体现在以下几个点:
-
页面架构清晰。对比以前mvp,mvvm或结合viewbinding,少去了很多接口及编写填充数据相关的代码
-
动画API简单好用。强大的动画支持,使得写动画非常简单。
-
开发效率高,写UI速度快,style、shape等样式使用简单。
-
另外、还有一些官方优势介绍
三、Compose 的重组作用域
虽然Compose 编译器在背后做了大量工作来保证 recomposition 范围尽可能小,我们还是需要对哪些情况发生了重组以及重组的范围有一定的了解 。
假设有如下代码:
@Composable
fun Foo() {
var text by remember { mutableStateOf("") }
Log.d(TAG, "Foo")
Button(onClick = {
text = "$text $text"
}.also { Log.d(TAG, "Button") }) {