协程与 Android 生命周期:该何时取消、何时保留
文章目录第 1 章 生命周期为什么约束协程第 2 章 lifecycleScope短 UI 副作用踩坑第 3 章 viewModelScope 与 Fragment 取 VM踩坑第 4 章 repeatOnLifecycle后台停止收集踩坑第 5 章 取消链从 UI 到 Repository第 6 章 SupervisorJob 与并行任务动手练练习 1Scope 选型A · 基础练习 2viewLifecycleOwnerB · 进阶练习 3repeatOnLifecycleD · Android 实践练习 4旋转行为C · 综合练习 5反模式B · 进阶练习 6WhileSubscribedA · 基础进阶阅读可选追问链 #1lifecycleScope vs viewModelScope 追问链 #2Fragment 旋转 collect 会断吗 追问链 #3为何弃用 launchWhenStarted ⭐追问链 #4CancellationException 要 catch 吗 完整链路一句通相关推荐第 1 章 生命周期为什么约束协程Activity/Fragment 会创建、显示、隐藏、销毁。协程若比界面活得更久可能更新已销毁的 View → 崩溃或泄漏后台白白耗电 collect 热流旋转屏重复发请求 → 列表闪白原则能放 ViewModel 的异步逻辑不要只塞在lifecycleScopeUI Scope 负责「收集状态 短 UI 副作用」。Scope绑定对象取消时机lifecycleScopeLifecycleOwneronDestroyviewModelScopeViewModelonCleared()viewLifecycleOwner.lifecycleScopeFragment 的 View 生命周期onDestroyView第 2 章 lifecycleScope短 UI 副作用classScanActivity:AppCompatActivity(){overridefunonCreate(savedInstanceState:Bundle?){super.onCreate(savedInstanceState)lifecycleScope.launch{delay(300)showHintSnackbar()// 短 UI 反馈}}}权限结果、动画结束后再刷 Snackbar 等与界面同寿命的操作适合lifecycleScope。数据加载应进 ViewModelclassTodoViewModel(privatevalrepo:TodoRepository,):androidx.lifecycle.ViewModel(){funload(){viewModelScope.launch{valitemsrepo.loadAll()// _state.update { it.copy(items items) } // 见《Flow 与 StateFlow》}}}旋转屏销毁 Activity 但ViewModel 保留viewModelScope内请求可继续——这是 MVVM 里「数据不因旋转而重拉」的基础。踩坑在lifecycleScope里调 Repository 拉列表——旋转可能取消请求或重复发起。第 3 章 viewModelScope 与 Fragment 取 VMclassTodoListFragment:Fragment(){privatevalviewModel:TodoViewModelbyviewModels()overridefunonViewCreated(view:View,savedInstanceState:Bundle?){super.onViewCreated(view,savedInstanceState)observeState()}privatefunobserveState(){viewLifecycleOwner.lifecycleScope.launch{viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED){viewModel.state.collect{ui-// 绑定列表}}}}}by viewModels()保证旋转后仍是同一TodoViewModel。viewLifecycleOwnerFragment 的 View 可能比 Fragment 实例先死收集必须绑 View 生命周期。踩坑用lifecycleScopeFragment 实例collect在onDestroyView之后仍可能运行。第 4 章 repeatOnLifecycle后台停止收集StateFlow是热流ViewModel 一直在 emit。若在lifecycleScope.launch { flow.collect }里直接 collectApp 进后台onStop后协程仍活着白白耗电还可能碰已销毁 View。viewLifecycleOwner.lifecycleScope.launch{viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED){viewModel.state.collect{state-render(state)}}}进入STOPPED时 cancel collect 块回到STARTED重新 collect并立刻拿到StateFlow当前值。ComposecollectAsStateWithLifecycle()封装同样语义。踩坑已废弃的launchWhenStarted新代码用repeatOnLifecycle。第 5 章 取消链从 UI 到 Repository用户返回 / finish() → Activity onDestroy → lifecycleScope 取消 ViewModelStore 清空 → ViewModel.onCleared() → viewModelScope 取消 → 子协程收到 CancellationException repeatOnLifecycle 离开 STARTED → collect 协程取消上游 stateIn 可按 WhileSubscribed 停suspend函数应在取消时尽快结束阻塞 IO 要可中断invokeOnCancellation解绑回调《suspend 与 Continuation》。第 6 章 SupervisorJob 与并行任务ViewModel 内并行多个独立launch时viewModelScope的SupervisorJob使一个失败不取消兄弟——但仍应在子协程内runCatching转错误态viewModelScope.launch{launch{loadHeader()}launch{loadFooter()}}不要在已取消的 scope 里更新 UI检查isActive或在runCatching里忽略CancellationException。动手练练习 1Scope 选型A · 基础目标lifecycle vs viewModel。要求列表数据加载用哪个 ScopeSnackbar 延迟显示用哪个各一句。练习 2viewLifecycleOwnerB · 进阶目标Fragment 收集。要求Fragment collect Flow 为何用viewLifecycleOwner而不是thisFragment练习 3repeatOnLifecycleD · Android 实践目标后台省电。要求说明不用repeatOnLifecycle时App 进后台 collect 仍运行的问题。练习 4旋转行为C · 综合目标配置变更。要求旋转屏时lifecycleScope与viewModelScope各自怎样正在进行的load()会不会中断练习 5反模式B · 进阶目标识别坏写法。要求lifecycleScope.launch { repo.loadAll(); adapter.submit(list) }有两处问题各写一句。练习 6WhileSubscribedA · 基础目标与生命周期配合。要求stateIn(WhileSubscribed(5000))在无 UI 订阅 5 秒后做什么有什么好处进阶阅读可选追问链 #1lifecycleScope vs viewModelScope 参考回答前者绑界面销毁即取消适合短 UI后者绑 ViewModel跨配置变更适合业务与 StateFlow 生产。追问链 #2Fragment 旋转 collect 会断吗 参考回答repeatOnLifecycle在 STOPPED 取消 collectSTARTED 重启ViewModel 与 state 保留不中断业务协程。追问链 #3为何弃用 launchWhenStarted ⭐参考回答暂停而非取消时行为易错repeatOnLifecycle语义清晰与 Flow 配合更好。追问链 #4CancellationException 要 catch 吗 参考回答一般向上抛不要当业务错误吞掉runCatching要注意重新抛出取消。完整链路一句通业务进 viewModelScope 生产 StateFlow→Fragment by viewModels() 拿同一 VM→viewLifecycleOwner.repeatOnLifecycle(STARTED) 内 collect→后台自动停 collect→销毁时 onCleared / CancellationException 收尾。相关推荐Kotlin 作用域函数let/apply 怎么选Kotlin 语法与空安全从零的第一课

相关新闻

机床测头撞了/测针断了,还有救吗?——分等级损伤评估与维修成本指南

机床测头撞了/测针断了,还有救吗?——分等级损伤评估与维修成本指南

测头撞了/测针断了,还有救吗?——分等级损伤评估与维修成本指南 编号:JCE-DOCG-WBQ260615 版本:V2.1 适用范围:数控机床(CNC加工中心)在线测量测头系统 适用品牌:雷尼绍(…

2026/7/23 22:56:38 阅读更多 →
从 Kimi K3 看 AI 创业终局:四层护城河与中小团队生存路径

从 Kimi K3 看 AI 创业终局:四层护城河与中小团队生存路径

Kimi K3重磅炸场!无数AI创业者无路可走?【摘要】通用大模型参数规模与综合能力高速迭代,垂直 AI 工具正面临同质化降维冲击。通过拆解工具、效率、业务、生态四层商业护城河框架,结合技术落地实践与产业案例,为 AI 创业…

2026/7/23 22:56:38 阅读更多 →
TVP5151视频解码芯片:模拟信号转数字YCbCr 4:2:2实战指南

TVP5151视频解码芯片:模拟信号转数字YCbCr 4:2:2实战指南

1. 项目概述:从模拟到数字的桥梁在数字视频处理的世界里,我们常常面对一个看似“古老”但依然无处不在的问题:如何处理那些来自老式摄像机、录像机、游戏机甚至某些监控系统的模拟视频信号?无论是NTSC制式的“雪花”画面&#xff…

2026/7/23 22:56:38 阅读更多 →

最新新闻

组织智能体三层双链模型:动态优化与自适应决策

组织智能体三层双链模型:动态优化与自适应决策

1. 组织智能体的三层双链模型概述在复杂系统管理与决策领域,组织智能体(Organizational Agent)正成为突破传统管理范式的新兴技术方向。这个模型通过三层架构(感知层、决策层、执行层)与双链机制(数据链、价…

2026/7/23 23:07:42 阅读更多 →
Llama3本地部署与性能优化实战指南

Llama3本地部署与性能优化实战指南

1. 为什么需要本地部署Llama3?在AI大模型应用开发领域,API调用虽然便捷,但存在三个致命短板:首先是响应延迟,每次推理都需要网络往返;其次是隐私风险,敏感数据需要离开本地环境;最重…

2026/7/23 23:07:42 阅读更多 →
AI大模型全栈学习指南:从零基础到高薪就业

AI大模型全栈学习指南:从零基础到高薪就业

1. 项目概述:大模型时代的学习突围指南这个资源包本质上是一套针对AI大模型领域的全栈学习解决方案。我花了三个月时间系统梳理了市面上主流的学习路径,结合自己从传统开发转型AI工程师的实战经验,最终形成了这套包含学习路线、面试真题和避坑…

2026/7/23 23:07:42 阅读更多 →
小米CVPR论文解析:大模型与强化学习驱动自动驾驶创新

小米CVPR论文解析:大模型与强化学习驱动自动驾驶创新

1. 小米技术突破背后的CVPR顶会论文解析当我在电脑前刷到小米多篇论文入选CVPR 2026的消息时,第一反应是打开论文列表逐篇研究。作为计算机视觉领域的"奥斯卡",CVPR的入选率常年维持在25%左右,而小米这次在自动驾驶、大模型等前沿方…

2026/7/23 23:07:42 阅读更多 →
面向AI的金融数据中间件stock-sdk-mcp设计与实践

面向AI的金融数据中间件stock-sdk-mcp设计与实践

1. 项目背景与核心价值去年在开发量化策略时,我发现传统金融数据接口存在几个致命痛点:数据清洗成本高、实时性差、API设计不符合AI训练习惯。每次把股票数据喂给模型前,都要写一堆格式转换和异常处理的胶水代码。stock-sdk-mcp这个项目正是为…

2026/7/23 23:07:42 阅读更多 →
2026网上商城系统开发哪家好?三类商家选型指南

2026网上商城系统开发哪家好?三类商家选型指南

今天给大家带来2026网上商城系统开发哪家好?三类商家选型指南。国家统计局数据显示,2024年全国网上零售额达 155225亿元,比上年增长 7.2%;其中,实物商品网上零售额 130816亿元,占社会消费品零售总额的比重为…

2026/7/23 23:06:42 阅读更多 →

日新闻

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

更多请点击: https://intelliparadigm.com 第一章:从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表) 当AI副业主理人不再仅满足于单次服务交付,而是主动构建可复用、可裂变、可…

2026/7/23 0:00:25 阅读更多 →
AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

更多请点击: https://codechina.net 第一章:AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析 在对2,346篇跨行业AI生成文案的A/B测试数据进行聚类分析后,我们发现&#xff1…

2026/7/23 0:01:26 阅读更多 →
Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具 【免费下载链接】chitchatter Secure peer-to-peer chat that is serverless, decentralized, and ephemeral 项目地址: https://gitcode.com/gh_mirrors/ch/chitchatter Chitchatter是一款革命性的安…

2026/7/23 0:01:26 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/22 8:58:19 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/22 19:43:43 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/23 17:49:47 阅读更多 →

月新闻