compose

1、什么是 Jetpack Compose?

答案

Jetpack Compose 是 Google 推出的声明式 UI 框架,替代传统 XML 布局;

用 纯 Kotlin 代码 写 UI,无需 XML、不用 findViewById、不用布局嵌套;

专为 Android 设计,原生、简洁、高效、跨版本兼容。

2、声明式 UI vs 命令式 UI 区别

答案

  • 传统 XML(命令式)

    先布局 XML,再 findViewById,手动一步步修改控件状态,命令控件做什么。

  • Compose(声明式)

    只声明当前 UI 应该长什么样,给状态赋值,框架自动刷新 UI;

    不用手动操作控件,状态驱动 UI。

一句话:命令式:手动改 UI;声明式:改状态自动刷新 UI。

3、Compose 核心优势

答案

  1. 抛弃 XML,纯代码写 UI;
  2. 没有 findViewById、没有布局层级嵌套,渲染更快;
  3. 状态驱动 UI,数据变 UI 自动变;
  4. 组件可复用、可组合,函数式编程;
  5. 原生适配主题、暗黑模式、动画、列表;
  6. 更少代码、更少 Bug、开发效率高;
  7. 自带生命周期感知、适配 Jetpack 全家桶。

4、什么是 可组合函数 @Composable

答案

  • 标记 @Composable 注解的函数,就是 UI 组件;
  • 不用返回 View,直接嵌套调用即可布局;
  • 只能在 @Composable 函数里调用;
  • 遵循无状态、纯函数特点:输入相同,UI 永远相同。

5、重组 Recomposition 是什么(必问)

答案

重组就是 Compose 局部刷新 UI 的机制:

当组合函数依赖的状态发生变化 时,Compose 只会重新执行受影响的 UI 函数,局部刷新,不是全局重绘。

特点:

  • 局部刷新、性能高
  • 不确定执行次数,可能多次执行
  • 可跳过不变化的组件,智能优化

6、Compose 状态管理有几种方式

答案

  1. remember :内存临时状态,页面重建会丢失
  2. rememberSaveable :横竖屏切换、页面重建保留状态
  3. MutableState / State:可观察状态,变化触发重组
  4. ViewModel + StateFlow / LiveData:跨生命周期、全局状态、页面共享状态

7、remember 和 rememberSaveable 区别

答案

  • remember 只在当前组合内保存,屏幕旋转、页面重建 数据丢失。
  • rememberSaveable 自动保存状态,横竖屏、进程重启 依然保留数据,类似 onSaveInstanceState。

8、Compose 如何监听状态变化

答案

依赖 MutableState、State、Flow、LiveData;

只要状态标记为可观察,值一变,自动触发重组刷新 UI,不用手动监听。

9、Compose 生命周期 和 传统 Activity 区别

答案 Compose 自有组件生命周期:

  • 进入组合:首次渲染
  • 保持组合:UI 保留
  • 退出组合:页面销毁、组件移除

可通过 DisposableEffect 监听组件进入 / 退出,做初始化、资源释放、取消协程。

10、Effect 副作用有哪些?各自作用

答案

  1. LaunchedEffect组合内启动协程、网络请求、延时任务,自动跟随组件生命周期,退出自动取消。
  2. SideEffect每次重组完成后执行,同步副作用。
  3. DisposableEffect 组件进入、退出时回调,用来注册监听、解绑释放资源。
  4. rememberCoroutineScope获取组合协程作用域,在点击事件里启动协程。

1、Compose 列表 LazyColumn / LazyRow 原理

答案

类似 RecyclerView 复用机制;

只渲染屏幕内可见 Item,滑出屏幕自动回收,懒加载、复用 Item,不一次性加载全部布局,性能极高。

12、Compose 能不能混用 传统 View

答案

完全可以。

通过 AndroidView 嵌套原生 XML、自定义 View、第三方控件;

老项目可以逐步迁移,不用一次性全改 Compose。

13、Compose 布局原理 传统 XML 区别

答案

  • XML:测量 + 布局 两次遍历,嵌套越多越卡;
  • Compose:单次遍历测量布局,无多余嵌套,性能更高;自带约束布局思维,减少层级。

14、Compose 性能优化怎么做

答案

  1. 拆分小粒度 Composable 函数,缩小重组范围;
  2. 用 key 稳定列表 Item,避免无效重组;
  3. 尽量用不可变参数,减少不必要重组;
  4. 合理使用 remember 缓存计算结果;
  5. 避免在组合函数里做耗时操作,放到 LaunchedEffect;
  6. 用 LazyColumn 代替 Column 做长列表。

15、Compose 数据流怎么和 ViewModel 配合

答案

ViewModel 里放 StateFlow / LiveData;

Compose 用 collectAsStateWithLifecycle / observeAsState 转为 UI 可观察状态;状态变化自动重组刷新 UI,完全符合 MVVM。

16、Compose 优缺点总结

答案优点:

  • 纯代码 UI,抛弃 XML;
  • 声明式、状态驱动,自动刷新;
  • 布局层级少,性能更好;
  • 组件复用、代码简洁;
  • 自带动画、主题、暗黑模式;
  • 完美适配 Jetpack、MVVM。

缺点:

  • 兼容低版本需要依赖兼容库;
  • 第三方部分旧控件适配少;
  • 重组机制容易写出无效刷新代码,需要理解原理。
相关推荐
三少爷的鞋9 小时前
AI 时代,我们都将成为通才型开发者:只懂 Android,已经不够了
android
Dovis(誓平步青云)13 小时前
家里设备越来越多,如何用一张空间地图控制灯光和温度![
android·java·前端·javascript·人工智能·电脑
晚风叙码15 小时前
MySQL 数据类型详解:从数值到字符串,一篇讲透
android·mysql·adb
传奇开心果编程15 小时前
【Compose Multiplatform 跨端开发学与练】第3课 布局与组件
android·windows·学习·ui·ios·kotlin·composer
传奇开心果编程18 小时前
【Compose Multiplatform 跨端开发学与练】第8课 资源管理与主题
android·windows·学习·ios·kotlin·web·composer
传奇开心果编程19 小时前
【Compose Multiplatform 跨端开发学与练】第9课 测试与调试
android·学习·macos·ios·kotlin·web·composer
传奇开心果编程19 小时前
【Compose Multiplatform 跨端开发学与练】第4课 导航与路由
android·windows·学习·ui·ios·kotlin·composer
传奇开心果编程20 小时前
【Compose Multiplatform 跨端开发学与练】第6课 状态管理与架构
android·学习·ui·ios·架构·kotlin·composer
事圆则缓20 小时前
Android AOSP 定制常见概念:源码目录、系统镜像与刷机流程
android
传奇开心果编程20 小时前
【Compose Multiplatform 跨端开发学与练】第2课 Compose 基础语法
android·windows·学习·ui·ios·kotlin·composer