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

news2025/6/8 19:14:35

在 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.coloradmin.cn/o/2404464.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TDengine 开发指南——无模式写入

简介 在物联网应用中,为了实现自动化管理、业务分析和设备监控等多种功能,通常需要采集大量的数据项。然而,由于应用逻辑的版本升级和设备自身的硬件调整等原因,数据采集项可能会频繁发生变化。为了应对这种挑战,TDen…

第34次CCF-CSP认证真题解析(目标300分做法)

第34次CCF-CSP认证 矩阵重塑(其一)AC代码及解析矩阵重塑(其二)AC代码及解析货物调度AC代码及解析 矩阵重塑(其一) 输入输出及样例: AC代码及解析 1.线性化原矩阵 :由于cin的特性我们…

video-audio-extractor:视频转换为音频

软件介绍 前几天在网上看见有人分享了一个源码,大概就是py调用的ffmpeg来制作的。 这一次我带来源码版(需要py环境才可以运行),开箱即用版本(直接即可运行) 软件特点 软件功能 视频提取音频&#xff1a…

[概率论基本概念4]什么是无偏估计

关键词:Unbiased Estimation 一、说明 对于无偏和有偏估计,需要了解其叙事背景,是指整体和抽样的关系,也就是说整体的叙事是从理论角度的,而估计器原理是从实践角度说事;为了表明概率理论(不可…

PL/SQLDeveloper中数值类型字段查询后显示为科学计数法的处理方式

PL/SQLDeveloper中数值类型字段查询后显示为科学计数法的处理方式 文章目录 PL/SQLDeveloper中数值类型字段查询后显示为科学计数法的处理方式1. 查询效果2. 处理方式3. 再次查询 1. 查询效果 2. 处理方式 3. 再次查询

【vue】Uniapp 打包Android 文件选择上传问题详解~

需求 uniapp兼容android app,pc,h5的文件选择并上传功能。 需要支持拍照和相册选择,以及选择其他类型文件上传~ 实践过程和问题 开始使用uni-file-picker组件 以为很顺利,android模拟器测试…… 忽略了平台兼容性提示~&#…

Ctrl-Crash 助力交通安全:可控生成逼真车祸视频,防患于未然

视频扩散技术虽发展显著,但多数驾驶数据集事故事件少,难以生成逼真车祸图像,而提升交通安全又急需逼真可控的事故模拟。为此,论文提出可控车祸视频生成模型 Ctrl-Crash,它以边界框、碰撞类型、初始图像帧等为条件&…

网络编程之服务器模型与UDP编程

一、服务器模型 在网络通信中,通常要求一个服务器连接多个客户端 为了处理多个客户端的请求,通常有多种表现形式 1、循环服务器模型 一个服务器可以连接多个客户端,但同一时间只能连接并处理一个客户的请求 socket() 结构体 bind() listen() …

Transformer-BiLSTM、Transformer、CNN-BiLSTM、BiLSTM、CNN五模型时序预测

Transformer-BiLSTM、Transformer、CNN-BiLSTM、BiLSTM、CNN五模型时序预测 目录 Transformer-BiLSTM、Transformer、CNN-BiLSTM、BiLSTM、CNN五模型时序预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Transformer-BiLSTM、Transformer、CNN-BiLSTM、BiLSTM、CNN五…

阿里云服务器安装nginx并配置前端资源路径(前后端部署到一台服务器并成功访问)

​​​运行以下命令,安装Nginx相关依赖。 yum install -y gcc-c yum install -y pcre pcre-devel yum install -y zlib zlib-devel yum install -y openssl openssl-devel 运行wget命令下载Nginx 1.21.6。 您可以通过Nginx开源社区直接获取对应版本的安装包URL&…

C++11新增重要标准(下)

前言 一,forward(完美转发) 二,可变参数模板 三,emplace系列接口 四,新增类功能 五,default与delete 六,lambda表达式 七,包装器 八,bind 在C11中新增…

【第六篇】 SpringBoot的日志基础操作

简介 日志系统在软件开发中至关重要,用于调试代码、记录运行信息及错误堆栈。本篇文章不仅详细介绍了日志对象的创建及快速使用,还说明了日志持久化的两种配置方式和滚动日志的设置。实际开发需根据场景选择合适的日志级别和存储策略。文章内容若存在错误…

Pluto论文阅读笔记

主要还是参考了这一篇论文笔记:https://zhuanlan.zhihu.com/p/18319150220 Pluto主要有三个创新点: 横向纵向用lane的query来做将轨迹投回栅格化地图,计算碰撞loss对数据进行正增强和负增强,让正增强的结果也无增强的结果相近&a…

matlab 2024a ​工具箱Aerospsce Toolbox报错​

Matlab R2024a中Aerospsce Toolbox报错 警告:Aerospace Toolbox and Aerospace Blockset licenses are required in ‘built-in/Spacecraft Dynamics’ 找到安装路径\MATLAB\R2024a\licenses文件夹license_****_R2024a.lic 里面工具箱名称出错,手动修改…

使用有限计算实现视频生成模型的高效训练

大家读完觉得有帮助记得关注和点赞!!! 抽象 视频生成的最新进展需要越来越高效的训练配方,以减轻不断上升的计算成本。在本报告中,我们介绍了 ContentV,这是一种 8B 参数文本到视频模型,在 256 …

Server2003 B-1 Windows操作系统渗透

任务环境说明: 服务器场景:Server2003(开放链接) 服务器场景操作系统:Windows7 1.通过本地PC中渗透测试平台Kali对服务器场景Windows进行系统服务及版本扫描渗透测试,并将该操作显示结果中Telnet服务对应的…

一次Oracle的非正常关闭

数据库自己会关闭吗? 从现象来说Oracle MySQL Redis等都会出现进程意外停止的情况。而这些停止都是非人为正常关闭或者暴力关闭(abort或者kill 进程) 一次测试环境的非关闭 一般遇到这种情况先看一下错误日志吧。 2025-06-01T06:26:06.35…

YOLO11解决方案之分析

概述 Ultralytics提供了一系列的解决方案,利用YOLO11解决现实世界的问题,包括物体计数、模糊处理、热力图、安防系统、速度估计、物体追踪等多个方面的应用。 Ultralytics提供了三种基本的数据可视化类型:折线图(面积图&#xf…

yolov11与双目测距结合,实现目标的识别和定位测距(onnx版本)

一、yolov11双目测距基本流程 yolov11 双目测距的大致流程就是: 双目标定 --> 立体校正(含消除畸变) --> 立体匹配 --> 视差计算 --> 深度计算(3D坐标)计算 --> 目标检测 --> 目标距离计算及可视化 下面将分别阐述每…

基于51单片机和8X8点阵屏、独立按键的填充消除类小游戏

目录 系列文章目录前言一、效果展示二、原理分析三、各模块代码1、8X8点阵屏2、独立按键3、定时器04、定时器1 四、主函数总结 系列文章目录 前言 使用的是普中A2开发板。 【单片机】STC89C52RC 【频率】12T11.0592MHz 【外设】8X8点阵屏、独立按键 效果查看/操作演示&#x…