一文弄懂 repeatOnLifecycle

repeatOnLifecycle 是 Android Jetpack 生命周期组件库中的一个实用扩展函数,主要用于在 LifecycleOwner(如 ActivityFragment)的生命周期状态变化时自动启动和取消协程任务。它结合了 Kotlin 协程和生命周期感知能力,帮助开发者避免内存泄漏和无效的资源消耗。


核心功能

  1. 自动启停协程
    Lifecycle 进入或退出指定状态(如 STARTEDRESUMED)时,自动启动或取消协程块内的任务。
  2. 避免内存泄漏
    协程会在 Lifecycle 销毁时自动取消,无需手动管理。
  3. 简化代码
    替代传统的 lifecycle.addObserver 手动监听,减少模板代码。

使用场景

  • Activity/Fragment 可见时(STARTED)开始数据加载,不可见时停止。
  • 替代 LiveData 的协程版本(如结合 Flow 使用)。

基本用法

1. 添加依赖

确保项目中已引入 lifecycle-runtime-ktx

kotlin 复制代码
implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.6.0"

2. 示例代码

kotlin 复制代码
class MyActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        
        lifecycleScope.launch {
            repeatOnLifecycle(Lifecycle.State.STARTED) {
                // 当 Activity 进入 STARTED 状态时启动协程
                someFlow.collect { data ->
                    updateUI(data)
                }
                // 当 Activity 进入 STOPPED 状态时自动取消协程
            }
        }
    }
}

关键参数

  • state

    指定触发协程的生命周期状态(通常为 STARTEDRESUMED):

    • STARTED:界面可见但可能未获取焦点(适合大多数场景)。
    • RESUMED:界面完全可见且可交互(需要严格实时性的场景)。

launchWhenX 的区别

特性 repeatOnLifecycle launchWhenStarted
协程取消时机 生命周期离开指定状态时取消 仅在生命周期销毁时取消
资源效率 更高(及时取消) 较低(可能后台运行)
推荐场景 数据流(如 Flow)收集 简单的一次性任务

官方推荐 ​:对于 Flow 收集,优先使用 repeatOnLifecycle


结合 Flow 使用

kotlin 复制代码
lifecycleScope.launch {
    repeatOnLifecycle(Lifecycle.State.STARTED) {
        viewModel.dataFlow
            .catch { /* 异常处理 */ }
            .collect { data -> updateUI(data) }
    }
}

注意事项

  1. 协程作用域
    需在 lifecycleScopeviewModelScope 中调用,确保协程与生命周期绑定。
  2. 状态选择
    根据需求选择 STARTEDRESUMED,避免过度频繁启停。
  3. 替代方案
    对于 Compose,可使用 collectAsStateWithLifecycle

通过 repeatOnLifecycle,开发者可以更安全、高效地管理协程任务的生命周期,尤其适合需要响应式数据更新的场景。

相关推荐
jinanwuhuaguo11 小时前
OpenClaw工程解剖——RAG、向量织构与“记忆宫殿”的索引拓扑学(第十三篇)
android·开发语言·人工智能·kotlin·拓扑学·openclaw
jinanwuhuaguo15 小时前
OpenClaw协议霸权——从 MCP 标准到意图封建化的政治经济学(第十八篇)
android·人工智能·kotlin·拓扑学·openclaw
zhangphil19 小时前
Android sql查媒体数据封装room Dao构造AndroidViewModel,RecyclerView宫格展示,Kotlin
android·kotlin
jinanwuhuaguo19 小时前
反熵共同体——OpenClaw的宇宙热力学本体论(第十七篇)
大数据·人工智能·安全·架构·kotlin·openclaw
pengyu19 小时前
【Kotlin 协程修仙录 · 筑基境 · 中阶】 | 身份证与通行证:CoroutineContext 的深度解剖
android·kotlin
夏沫琅琊20 小时前
android 短信读取与导出技术
android·kotlin
Kapaseker1 天前
客官,你误会 Compose Strong Skipping 了
android·kotlin
我命由我123451 天前
Kotlin 开发 - 双冒号操作符(引用顶层函数、引用成员函数、引用构造函数、引用属性、引用类)
android·java·开发语言·kotlin·android studio·android jetpack·android-studio
我命由我123451 天前
Kotlin 开发 - sealed 关键字
android·java-ee·kotlin·android studio·android jetpack·android-studio·android runtime
我命由我123452 天前
Java 开发 - CountDownLatch 不需要手动关闭
android·java·开发语言·jvm·kotlin·android studio·android-studio