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

相关推荐
移动开发者1号7 分钟前
Android ContentProvider多表关联查询
android·kotlin
移动开发者1号10 分钟前
显式与隐式Intent调用对比
android·kotlin
移动开发者1号13 分钟前
Android后台服务保活简介
android·kotlin
移动开发者1号15 分钟前
Android后台任务管理利器
android·kotlin
移动开发者1号19 小时前
Fragment懒加载优化方案总结
android·kotlin
移动开发者1号20 小时前
Android Activity启动模式面试题
android·kotlin
alexhilton20 小时前
Jetpack Compose 中ViewModel的最佳实践
android·kotlin·android jetpack
猿小蔡-Cool1 天前
Kotlin 中 Lambda 表达式的语法结构及简化推导
开发语言·windows·kotlin
wzj_what_why_how2 天前
Kotlin JVM 注解详解
android·kotlin
雨白2 天前
Kotlin 标准函数 with, run, apply 与静态方法实现
kotlin