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

Jetpack Compose + 协程(Coroutine)完整实战教程

Jetpack Compose 协程Coroutine完整实战教程现代 Android 开发里Compose 协程 Flow已经是官方主流架构。如果你只会Button(onClick{})但不会LaunchedEffectrememberCoroutineScopeStateFlowcollectAsStateCompose 生命周期协程那基本还没进入真正的 Compose 开发。这一篇从原理 → 生命周期 → 实战 → 架构完整讲透。一、为什么 Compose 特别依赖协程因为Compose 是声明式 UIUI 本身状态变化 → 自动刷新而协程非常适合异步请求状态更新Flow 数据流UI 生命周期所以Compose 和协程天然契合。二、Compose 中最重要的协程 APIAPI作用LaunchedEffect页面生命周期协程rememberCoroutineScope手动启动协程collectAsState收集 FlowproduceState协程转 StatesnapshotFlowState 转 Flow三、LaunchedEffect最核心这是 Compose 协程第一核心。四、第一个 LaunchedEffectComposablefunTestPage(){LaunchedEffect(Unit){delay(2000)println(执行)}}它是什么本质Compose 生命周期协程当 Composable 进入界面自动启动协程离开界面自动取消协程五、为什么不能直接 launch很多新人这样写ComposablefunTest(){GlobalScope.launch{// ...}}这是错误的。因为Composable 会频繁重组Recompose可能疯狂创建协程导致内存泄漏、重复请求、协程爆炸六、LaunchedEffect 生命周期阶段行为进入 Composition启动协程离开 Composition取消协程key 改变重新启动协程七、key 的作用非常重要LaunchedEffect(userId){loadUser(userId)}当userId变化时取消旧协程启动新协程八、LaunchedEffect(Unit)最常见。LaunchedEffect(Unit)表示仅首次进入执行一次类似Activity.onCreate()九、Compose 倒计时ComposablefunCountDown(){vartimebyremember{mutableStateOf(10)}LaunchedEffect(Unit){while(time0){delay(1000)time--}}Text($time)}为什么 UI 自动刷新因为mutableStateOf状态变化后Compose 自动重组 UI。十、rememberCoroutineScope第二核心。十一、为什么需要它因为Button点击时不能直接调用 suspend错误Button(onClick{delay(1000)// onClick 不是 suspend})十二、正确写法ComposablefunTest(){valscoperememberCoroutineScope()Button(onClick{scope.launch{delay(1000)println(点击)}}){Text(按钮)}}十三、rememberCoroutineScope 本质它返回与当前 Composition 绑定的 CoroutineScope页面销毁自动 cancel。十四、LaunchedEffect vs rememberCoroutineScope这是高频面试题。LaunchedEffectrememberCoroutineScope适合自动执行任务适合用户事件触发页面初始化Button 点击自动请求手势事件倒计时SnackbarFlow 收集十五、Compose ViewModel现代 Android 标准方案。ViewModelclassUserViewModel:ViewModel(){varuserbymutableStateOfUser?(null)privatesetfunloadUser(){viewModelScope.launch{userapi.getUser()}}}ComposeComposablefunUserPage(vm:UserViewModelviewModel()){LaunchedEffect(Unit){vm.loadUser()}Text(vm.user?.name?:)}为什么不用 lifecycleScopeCompose 推荐ViewModelScopeUI 只负责显示状态十六、Compose StateFlow现代官方方案这是最重要的。ViewModelclassUserViewModel:ViewModel(){privateval_uiStateMutableStateFlowUser?(null)valuiState_uiState.asStateFlow()funload(){viewModelScope.launch{_uiState.valueapi.getUser()}}}Compose 收集 FlowComposablefunUserPage(vm:UserViewModelviewModel()){valuserbyvm.uiState.collectAsState()Text(user?.name?:)}十七、collectAsState 本质它将Flow → Compose State当 Flow 发射新数据自动重组 UI。十八、完整执行流程最重要ViewModelScope ↓ 网络请求 ↓ StateFlow更新 ↓ collectAsState收到 ↓ Compose自动重组 ↓ UI刷新这就是现代 Android UI 响应式架构十九、Compose Retrofit 协程完整现代写法。RepositoryclassUserRepository{suspendfungetUser()api.getUser()}ViewModelclassUserViewModel:ViewModel(){privatevalrepositoryUserRepository()varuserbymutableStateOfUser?(null)privatesetfunloadUser(){viewModelScope.launch{userrepository.getUser()}}}Compose UIComposablefunUserScreen(vm:UserViewModelviewModel()){LaunchedEffect(Unit){vm.loadUser()}Text(vm.user?.name?:)}二十、为什么不在 Compose 直接请求网络错误LaunchedEffect(Unit){api.getUser()}因为UI 不应该直接操作数据层否则不好测试、生命周期混乱、逻辑耦合。二十一、Compose 中的协程取消Compose 生命周期结束自动 cancel。例如LaunchedEffect离开页面协程自动结束。二十二、rememberUpdatedState高级经典问题LaunchedEffect 内拿到旧值。vallatestCallbackbyrememberUpdatedState(onClick)作用始终拿到最新 lambda避免闭包旧引用问题。二十三、produceState作用协程 → StatevaluserbyproduceStateUser?(null){valueapi.getUser()}本质内部其实就是LaunchedEffect mutableStateOf二十四、snapshotFlow作用Compose State → FlowsnapshotFlow{text}.collect{// ...}适合搜索监听、输入变化、滚动监听。二十五、Compose 搜索防抖经典实战ViewModelclassSearchViewModel:ViewModel(){valkeywordMutableStateFlow()init{viewModelScope.launch{keyword.debounce(500).collect{search(it)}}}}ComposeTextField(valuetext,onValueChange{textit vm.keyword.valueit})二十六、Snackbar 协程这是rememberCoroutineScope高频场景。valsnackbarHostStateremember{SnackbarHostState()}valscoperememberCoroutineScope()Button(onClick{scope.launch{snackbarHostState.showSnackbar(成功)}}){}二十七、Compose 动画为什么也用协程Compose 动画很多本质也是 suspend。例如Animatable.animateTo()内部协程驱动帧刷新二十八、Compose 中常见错误错误说明在 Composable 直接GlobalScope.launch生命周期不可控重组导致重复请求api.getUser()直接写在 UIcollect没有生命周期flow.collect可能泄漏二十九、正确的 Flow 收集推荐collectAsState()或者collectAsStateWithLifecycle()官方推荐三十、collectAsStateWithLifecycleimplementationandroidx.lifecycle:lifecycle-runtime-composevaluiStatebyvm.uiState.collectAsStateWithLifecycle()为什么推荐它自动处理生命周期页面不可见自动暂停收集。三十一、Compose Room Flow现代数据库方案。DAOQuery(SELECT * FROM user)fungetUsers():FlowListUserComposevalusersbydao.getUsers().collectAsState(initialemptyList())数据库变化UI 自动刷新。三十二、Compose Paging3 协程现代列表方案。ViewModelPager(...).flow.cachedIn(viewModelScope)ComposecollectAsLazyPagingItems()三十三、Compose 协程源码核心最核心RecomposerCoroutineScopeMonotonicFrameClockCompose 本质也是协程驱动。三十四、Compose 为什么不卡 UI因为suspend不阻塞线程Recomposer分帧执行状态驱动刷新三十五、Compose 协程面试题1. LaunchedEffect 和 rememberCoroutineScope 区别API用途LaunchedEffect自动生命周期任务rememberCoroutineScope用户事件协程2. collectAsState 本质Flow → State3. Compose 为什么容易重复请求因为重组Recomposition4. 为什么不用 GlobalScope因为生命周期不可控5. Compose 官方推荐状态方案StateFlowcollectAsStateWithLifecycle三十六、现代 Compose 最佳架构企业级Compose UI ↓ ViewModel ↓ StateFlow ↓ Repository ↓ Retrofit / Room三十七、真正理解 Compose 协程Compose 真正核心UI State 的函数而协程负责异步修改 State最终State变化 → Compose自动重组 → UI自动刷新这就是现代 Android 的本质。三十八、真正的大脑模型最重要看到LaunchedEffect自动想到Composition生命周期 CoroutineScope 自动取消看到collectAsState()自动想到Flow → State → Recomposition看到viewModelScope.launch自动想到协程 → 更新StateFlow → Compose刷新UI三十九、最后一句Compose 为什么这么强传统 AndroidCompose手动找View状态驱动UI手动刷新UI协程驱动异步手动管理生命周期Flow驱动数据流这就是Google 现在整个 Android UI 架构的核心方向。

相关文章:

Jetpack Compose + 协程(Coroutine)完整实战教程

Jetpack Compose 协程(Coroutine)完整实战教程 现代 Android 开发里: Compose 协程 Flow 已经是官方主流架构。 如果你只会: Button(onClick {})但不会: LaunchedEffectrememberCoroutineScopeStateFlowcollectAsS…...

基于图像识别的UI自动化测试:从OpenCV模板匹配到实战应用

1. 项目概述与核心价值最近在GitHub上看到一个挺有意思的项目,叫GoatInAHat/openclaw-paperbanana。光看这个名字,你可能会觉得有点摸不着头脑——“山羊在帽子里”和“纸香蕉”是什么组合?但如果你对自动化测试、特别是UI自动化领域有所涉猎…...

Win11 一键安装 OpenClaw 从下载到使用完整版

适配系统:Windows 11 专业版 / 家庭版 / 正式版(全版本兼容) 项目介绍:OpenClaw 是 GitHub 星标 28W 的开源本地 AI 智能体,可自动操控电脑、整理文件、浏览器自动化、办公自动化,被国内用户称为小龙虾&…...

2026年南京GEO优化行业乱象解析:差异化痛点与行业合规发展建议

伴随生成式人工智能普及,GEO生成式引擎优化成为南京本地企业数字化布局的重要渠道。2026年本地传统线下企业、中小型工贸企业、服务业企业普遍入局AI内容优化赛道。目前南京GEO服务市场入局主体繁杂,包含传统SEO转型团队、小型个人工作室、本土科技企业、…...

【开源】电商运营场景的 Agent :EcomPilot经营诊断神器 附github

github地址 https://github.com/baibai-awd/ecommerce-ops-agent一个面向电商运营场景的 Agent 项目:EcomPilot 电商经营诊断 Agent。这个项目不是简单的聊天机器人,而是围绕真实业务流程设计的智能分析系统。它可以自动读取电商运营数据,分析…...

智能体框架构建指南:从核心原理到工程实践

1. 项目概述:从代码仓库到智能体构建框架的深度解读最近在开源社区里,一个名为1kurepin/agentify的项目引起了我的注意。乍一看,这只是一个普通的 GitHub 仓库名,但如果你对当前 AI 领域,特别是智能体(Agen…...

智能AI研修系统:解锁轻量化智能研修的核心技术逻辑

很多人以为智能AI研修系统,只是普通的线上听课、刷题工具,其实这是很大的误解。传统研修模式模式固化、内容同质化严重,还需要人工统计学时、整理学习资料,费时又低效。而智能AI研修系统,是依托多项AI核心技术打造的专…...

如何在项目中引入googtest(上)——通过编译器引入库

https://blog.csdn.net/qq_42615475/article/details/129469406...

Equalizer APO:Windows音频系统的终极调音神器完全指南

Equalizer APO:Windows音频系统的终极调音神器完全指南 【免费下载链接】equalizerapo Equalizer APO mirror 项目地址: https://gitcode.com/gh_mirrors/eq/equalizerapo 你是否曾对Windows系统自带的音频效果感到不满?是否想要获得专业级的音质…...

科技史上的今天:5月14日-百年技术沉淀,引领时代变革

2015年:HTTP/2 正式发布2015年5月14日,HTTP/2 标准正式发布,作为HTTP/1.1的重大升级,采用二进制分帧、多路复用等技术,解决串行阻塞痛点,显著提升网页加载速度与传输效率,为现代Web及物联网通信…...

如何快速使用QVina:分子对接的终极完整指南

如何快速使用QVina:分子对接的终极完整指南 【免费下载链接】qvina Accurately speed up AutoDock Vina 项目地址: https://gitcode.com/gh_mirrors/qv/qvina QVina是一个高效准确的分子对接工具,专门用于加速AutoDock Vina的计算过程。如果你正在…...

如何验证AI语音通话厂商宣传的识别率是否注水?完整测试方法

如何验证AI语音通话厂商宣传的识别率是否注水?完整测试方法不废话,先上结论。如何验证AI语音通话厂商宣传的识别率是否注水?完整测试方法摘要数据显示,AI语音通话市场上,厂商宣称的识别率普遍在95%以上,但第…...

免费获取A股行情数据的终极解决方案:Python通达信接口实战指南

免费获取A股行情数据的终极解决方案:Python通达信接口实战指南 【免费下载链接】mootdx 通达信数据读取的一个简便使用封装 项目地址: https://gitcode.com/GitHub_Trending/mo/mootdx 在前100个字内,MOOTDX作为一款基于Python的通达信数据接口封…...

Android Studio的安装及配置 创建项目编译、运行、调试、打包安装包

Android Studio安装 Android Studio是Google官方的 Android 应用开发集成环境(IDE),基于 IntelliJ IDEA,支持 Windows/macOS/Linux,2013 年首次发布。 下载地址:https://developer.android.com/studio/ar…...

如何快速实现跨平台输入法词库转换:开源工具的完整指南

如何快速实现跨平台输入法词库转换:开源工具的完整指南 【免费下载链接】imewlconverter ”深蓝词库转换“ 一款开源免费的输入法词库转换程序 项目地址: https://gitcode.com/gh_mirrors/im/imewlconverter 你是否曾经因为更换操作系统或输入法而丢失了多年…...

终极指南:如何用AnyKernel3一键创建完美Android内核刷机包

终极指南:如何用AnyKernel3一键创建完美Android内核刷机包 【免费下载链接】AnyKernel3 AnyKernel, Evolved 项目地址: https://gitcode.com/gh_mirrors/an/AnyKernel3 想要为你的Android设备制作内核刷机包,却总是被复杂的设备兼容性搞得焦头烂额…...

ucharts的使用

uCharts是一款基于canvas API开发的适用于所有前端应用的图表库,开发者编写一套代码,可运行到 Web、iOS、Android(基于 uni-app / taro )、以及各种小程序(微信/支付宝/百度/头条/飞书/QQ/快手/钉钉/淘宝/京东/360&…...

ARM GICv3虚拟中断控制器架构与ICH_LR寄存器解析

1. ARM GICv3虚拟中断控制器架构概述在ARMv8-A架构的虚拟化环境中,中断控制器的虚拟化是实现高效虚拟机隔离和实时响应的关键技术。GICv3作为第三代通用中断控制器,通过引入虚拟化扩展(Virtualization Extensions)为每个虚拟CPU(vCPU)提供了完整的虚拟中…...

BlenderGIS插件实战:从OSM数据到城市建筑3D模型全流程解析

1. 环境准备与插件安装 第一次接触BlenderGIS时,我也被各种报错折腾得够呛。这里分享一个零失败的安装方案,特别适合Windows系统用户。首先去Blender官网下载最新稳定版(目前是3.6 LTS),建议选便携版(zip)而非安装版&a…...

云微推客系统开发|企业级私域裂变引擎,防丢单防错佣,合规二级分销

一、前言存量竞争时代,花钱买流量越来越贵,转化却越来越低。很多商家尝试推广裂变,却面临推广人员难管理、佣金结算混乱、订单归属不清、作弊刷单难防控、系统不合规易封号五大难题。传统人工记账、手动算佣模式,不仅效率低、成本…...

ESP32物联网网关开发实战:从硬件选型到实时控制协议设计

1. 项目概述:一个连接物理世界与数字世界的“桥梁”最近在折腾一个挺有意思的项目,名字叫openclaw-esp32-bridge。光看这个仓库名,就能嗅到一股浓浓的“硬核”和“连接”的味道。openclaw听起来像是一个开源的控制或抓取系统,而es…...

SkillHarness:轻量级技能编排框架,构建可维护的AI与自动化工作流

1. 项目概述:一个面向开发者的技能编排与自动化框架最近在和一些做AI应用开发的朋友交流时,大家普遍提到一个痛点:当你想把多个AI模型、工具或者API串联起来,完成一个稍微复杂点的任务时,比如“分析一篇技术文章&#…...

如何用Python快速接入Taotoken调用多模型API完成项目开发

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 如何用Python快速接入Taotoken调用多模型API完成项目开发 对于开发者而言,快速验证一个想法或启动一个项目&#xff0c…...

Open Liberty Docker镜像深度解析:企业级Java应用容器化部署实战

1. 项目概述:一个企业级Java应用服务器的开源镜像 如果你在Java企业级应用开发领域摸爬滚打过几年,尤其是和WebSphere家族的产品打过交道,那么“Liberty”这个名字你一定不陌生。它代表着一种轻量、快速、模块化的Java EE(现在叫J…...

AirSim无人机仿真入门:从Unreal视角设置到Python API调用的保姆级避坑全流程

AirSim无人机仿真入门:从Unreal视角设置到Python API调用的保姆级避坑全流程 当你第一次打开AirSim的官方文档,可能会被那些专业术语和零散的配置步骤搞得晕头转向。作为微软开源的无人机与自动驾驶仿真平台,AirSim确实强大,但它的…...

Agent 工具调用决策链的治理框架:从意图识别到执行回滚的长期演进策略

问题现象 生产环境中,智能体系统在面对用户请求时频繁出现“该调工具却直接回复”或“不该调工具却强行调用”的误判行为。典型表现为:用户询问“帮我查一下昨天的订单”,系统返回一段通用话术而非调用订单查询接口;而当用户明确说…...

MATLAB imagesc保姆级教程:从单一热图到多图排版,附完整代码

MATLAB imagesc全攻略:从热图绘制到高级排版实战 在数据科学和工程领域,可视化是理解复杂矩阵数据不可或缺的一环。MATLAB作为技术计算领域的标杆工具,提供了imagesc这一强大的矩阵可视化函数,能够将抽象的数字矩阵转化为直观的热…...

CircuitPython I2C与HID实战:从TSL2591传感器到键盘鼠标模拟

1. 项目概述与核心价值如果你正在玩转像Adafruit ItsyBitsy、Metro这类小巧但功能强大的CircuitPython开发板,并且想让它们不仅仅是运行几行简单的脚本,而是真正地与外部世界“对话”——比如读取一个高精度的环境传感器数据,或者干脆把你的硬…...

DECS训练框架:大模型推理效率革命——从“冗余思考“到“精准输出“的技术涅槃

技术标签:DECS、ICLR 2026、大模型推理优化、Token压缩、推理效率 引言:当"长思考"成为效率噩梦 2026年5月,一项入选ICLR 2026顶会的研究成果彻底打破了AI行业长久以来的认知惯性——"思考越长、推理越准"并非铁律。 传统大模型在推理过程中会产生大量…...

CircuitPython嵌入式开发入门:从LED闪烁到DVI显示的综合实践指南

1. 项目概述:从“Hello, World!”到硬件交互的艺术 如果你对编程稍有了解,一定听说过“Hello, World!”——那个向世界宣告程序开始运行的经典仪式。在桌面编程的世界里,它可能是一行打印在终端上的文字。但在嵌入式开发这片天地里&#xff…...