一文弄懂 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,开发者可以更安全、高效地管理协程任务的生命周期,尤其适合需要响应式数据更新的场景。

相关推荐
alexhilton2 天前
端侧RAG实战指南
android·kotlin·android jetpack
Kapaseker2 天前
2026年,我们还该不该学编程?
android·kotlin
Kapaseker3 天前
一杯美式搞懂 Any、Unit、Nothing
android·kotlin
Kapaseker4 天前
一杯美式搞定 Kotlin 空安全
android·kotlin
FunnySaltyFish5 天前
什么?Compose 把 GapBuffer 换成了 LinkBuffer?
算法·kotlin·android jetpack
Kapaseker5 天前
Compose 进阶—巧用 GraphicsLayer
android·kotlin
Kapaseker6 天前
实战 Compose 中的 IntrinsicSize
android·kotlin
A0微声z8 天前
Kotlin Multiplatform (KMP) 中使用 Protobuf
kotlin
alexhilton9 天前
使用FunctionGemma进行设备端函数调用
android·kotlin·android jetpack
lhDream9 天前
Kotlin 开发者必看!JetBrains 开源 LLM 框架 Koog 快速上手指南(含示例)
kotlin