repeatOnLifecycle
是 Android Jetpack 生命周期组件库中的一个实用扩展函数,主要用于在 LifecycleOwner
(如 Activity
或 Fragment
)的生命周期状态变化时自动启动和取消协程任务。它结合了 Kotlin 协程和生命周期感知能力,帮助开发者避免内存泄漏和无效的资源消耗。
核心功能
- 自动启停协程
当Lifecycle
进入或退出指定状态(如STARTED
或RESUMED
)时,自动启动或取消协程块内的任务。 - 避免内存泄漏
协程会在Lifecycle
销毁时自动取消,无需手动管理。 - 简化代码
替代传统的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
指定触发协程的生命周期状态(通常为
STARTED
或RESUMED
):STARTED
:界面可见但可能未获取焦点(适合大多数场景)。RESUMED
:界面完全可见且可交互(需要严格实时性的场景)。
与 launchWhenX
的区别
特性 | repeatOnLifecycle |
launchWhenStarted |
---|---|---|
协程取消时机 | 生命周期离开指定状态时取消 | 仅在生命周期销毁时取消 |
资源效率 | 更高(及时取消) | 较低(可能后台运行) |
推荐场景 | 数据流(如 Flow )收集 |
简单的一次性任务 |
官方推荐 :对于
Flow
收集,优先使用repeatOnLifecycle
。
结合 Flow 使用
kotlin
lifecycleScope.launch {
repeatOnLifecycle(Lifecycle.State.STARTED) {
viewModel.dataFlow
.catch { /* 异常处理 */ }
.collect { data -> updateUI(data) }
}
}
注意事项
- 协程作用域
需在lifecycleScope
或viewModelScope
中调用,确保协程与生命周期绑定。 - 状态选择
根据需求选择STARTED
或RESUMED
,避免过度频繁启停。 - 替代方案
对于Compose
,可使用collectAsStateWithLifecycle
。
通过 repeatOnLifecycle
,开发者可以更安全、高效地管理协程任务的生命周期,尤其适合需要响应式数据更新的场景。