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。

缺点:

  • 兼容低版本需要依赖兼容库;
  • 第三方部分旧控件适配少;
  • 重组机制容易写出无效刷新代码,需要理解原理。
相关推荐
阿巴斯甜1 小时前
Glide
android
-SOLO-1 小时前
使用Perfetto debug trace查看超时slice
android
阿巴斯甜1 小时前
Retrofit
android
阿巴斯甜1 小时前
OkHttp
android
阿巴斯甜2 小时前
Flow
android
用户86022504674724 小时前
Claw 分析 Perfetto Trace
android
游戏开发爱好者84 小时前
使用Fiddler设置HTTPS抓包诊断Power Query网络问题
android·ios·小程序·https·uni-app·iphone·webview
阿巴斯甜5 小时前
Lifecycle
android
fengci.5 小时前
CTF+随机困难部分
android·开发语言·网络·安全·php