协程与 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/10/24 11:48:23 阅读更多 →
从 Kimi K3 看 AI 创业终局:四层护城河与中小团队生存路径

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

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

2026/10/25 10:05:42 阅读更多 →
TVP5151视频解码芯片:模拟信号转数字YCbCr 4:2:2实战指南

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

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

2026/10/21 22:16:14 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/10/25 11:19:54 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/10/24 17:47:00 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/10/24 18:34:36 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/10/25 10:02:42 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/10/25 3:12:30 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/10/24 21:09:59 阅读更多 →

日新闻

周新闻

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/25 10:02:43 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/25 13:21:54 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/25 7:47:32 阅读更多 →