当前位置: 首页 > ops >正文

Jetpack Compose 中,DisposableEffect、LaunchedEffect 和 sideEffect 区别和用途

在 Jetpack Compose 中,DisposableEffectLaunchedEffect 和 sideEffect 都是用于处理副作用(Side Effects)的 API,但它们的用途和触发时机不同。以下是它们的核心概念和区别:

1. 副作用(Side Effect)是什么?

副作用是指 Composable 函数中与界面渲染无关的操作,例如:

  • 发起网络请求

  • 订阅/取消订阅数据流

  • 修改外部变量或状态

  • 访问 Android 系统 API(如权限、生命周期)

由于 Composable 函数可能会频繁重组(Recomposition),副作用需要被可控地管理,避免重复执行或资源泄漏。

2. 三者的对比

API用途触发时机清理机制适用场景
LaunchedEffect在 Composable 中启动一个协程,执行挂起函数(如异步任务)。当 key 变化时,会取消之前的协程并重新启动。自动取消协程一次性异步操作(如网络请求、动画)。
DisposableEffect执行需要清理的资源操作(如监听器、订阅)。当 key 变化时,先执行清理逻辑,再重新执行副作用。需手动清理(onDispose需要释放资源的操作(如广播、RxJava 订阅)。
sideEffect在每次成功重组后执行的非阻塞操作,不依赖重组是否跳过。每次重组后(即使其他部分跳过重组)。更新外部状态(如 Analytics 日志、非关键状态同步)。

3. 详细说明与代码示例

(1) LaunchedEffect
  • 用途:在 Composable 中安全启动协程,适合异步任务。

  • 特点

    • 自动取消:当 key 变化或 Composable 退出时,协程会被取消。

    • 必须指定 key(用于控制重启条件)。

@Composable
fun TimerDemo() {var time by remember { mutableStateOf(0) }LaunchedEffect(Unit) { // 传入 Unit 表示只启动一次while (true) {delay(1000)time++}}Text("Time: $time")
}
(2) DisposableEffect
  • 用途:管理需要手动释放的资源(如监听器、订阅)。

  • 特点

    • 必须调用 onDispose 清理资源。

    • key 变化时,先执行 onDispose,再重新初始化。

  • @Composable
    fun SensorDemo() {val sensorManager = remember { getSystemService(Context.SENSOR_SERVICE) as SensorManager }var data by remember { mutableStateOf(0f) }DisposableEffect(Unit) {val listener = object : SensorEventListener {override fun onSensorChanged(event: SensorEvent) {data = event.values[0]}override fun onAccuracyChanged(sensor: Sensor, accuracy: Int) {}}sensorManager.registerListener(listener, sensor, SensorManager.SENSOR_DELAY_NORMAL)onDispose { // 必须清理!sensorManager.unregisterListener(listener)}}Text("Sensor value: $data")
    }
(3) sideEffect
  • 用途:在重组后执行非阻塞操作,通常用于与 Compose 无关的状态同步。

  • 特点

    • 每次重组后都会执行(即使其他部分跳过了重组)。

    • 无清理机制,适合轻量级操作。

@Composable
fun AnalyticsButton(clicked: Boolean) {Button(onClick = { /* ... */ }) {Text("Click Me")}sideEffect {if (clicked) {logAnalyticsEvent("ButtonClicked") // 记录日志}}
}

4. 关键区别总结

场景LaunchedEffectDisposableEffectsideEffect
异步任务✅(协程)
需要清理的资源✅(监听器、订阅)
重组后状态同步✅(日志、统计)
自动取消/清理✅(协程)✅(需手动 onDispose

5. 如何选择?

  • 需要协程? → LaunchedEffect

  • 需要释放资源? → DisposableEffect

  • 只需在重组后同步状态? → sideEffect

通过合理使用这些 API,可以避免副作用导致的性能问题或内存泄漏。

http://www.xdnf.cn/news/12569.html

相关文章:

  • 深入解析 CAS 操作
  • Linux 系统、代码与服务器进阶知识深度解析
  • 【Python】当前最稳定3.12版本安装,基于Anaconda的环境配置及换源
  • 力扣面试150题--除法求值
  • 计算矩阵A和B的乘积
  • 基于Python学习《Head First设计模式》第八章 模板方法模式
  • Readest(电子书阅读器) v0.9.53
  • 缓存一致性 与 执行流
  • STM32学习笔记:外部中断(EXTI)原理与应用详解
  • 什么是可恢复保险丝
  • 永恒之蓝(CVE-2017-0146)详细复现
  • day49 python 注意力热图
  • Oracle 客户端深度指南:SQL Developer 与 PL/SQL Developer 全面安装使用教程
  • MySQL中的内置函数
  • 深入剖析Nginx:从入门到高并发架构实战
  • day24 元组和OS模块
  • 十、【ESP32开发全栈指南: TCP客户端】
  • LinkedList、Vector、Set
  • 嵌入式学习笔记 - freeRTOS vTaskPlaceOnEventList()函数解析
  • VirtualBox启动失败@Ubuntu22.04 说是配置文件有问题
  • 使用ORM Bee (ormbee) ,如何利用SQLAlchemy的模型生成数据库表.
  • “组件、路由懒加载”,在 Vue3 和 React 中分别如何实现? (copy)
  • 使用Python和Flask构建简单的机器学习API
  • MySQL事务与锁中的MVCC 深度解析与面试题讲解
  • Spring AI 核心工作流
  • 每日Prompt:治愈动漫插画
  • 基于深度学习的金枪鱼各类别目标检测含完整数据集
  • Strong Baseline: Multi-UAV Tracking via YOLOv12 with BoT-SORT-ReID 2025最新无人机跟踪
  • 【C/C++】实现固定地址函数调用
  • 2种官方方法关闭Windows防火墙