Android:lifecycleScope.launchWhenResumed已弃用,如何实现单次运行逻辑?
用repeatOnLifecycle替代弃用的launchWhenResumed实现单次执行逻辑
原来的launchWhenResumed会在生命周期进入RESUMED状态时启动协程,任务执行完成后即结束,后续再次进入RESUMED也不会重复执行。而官方推荐的repeatOnLifecycle默认会在每次进入指定状态时触发块内逻辑,要保持单次执行的行为,你可以通过状态标记+repeatOnLifecycle的组合实现:
实现代码
import java.util.concurrent.atomic.AtomicBoolean // 声明线程安全的执行标记,确保多线程下判断准确 private val hasTaskExecuted = AtomicBoolean(false) // 在合适的位置(比如Activity/Fragment的onCreate)添加以下代码 lifecycleScope.launch { repeatOnLifecycle(Lifecycle.State.RESUMED) { // 仅当标记为未执行时,才执行任务并更新标记 if (hasTaskExecuted.compareAndSet(false, true)) { // 这里替换成你需要单次执行的逻辑 fetchData() initViewState() } } }
逻辑说明
- 原子布尔标记:
AtomicBoolean保证在多线程环境下,标记的判断和更新操作是原子性的,避免重复执行的可能。 - repeatOnLifecycle的作用:确保协程仅在生命周期处于RESUMED状态时执行,离开RESUMED时会自动取消协程(和原
launchWhenResumed的生命周期感知行为一致)。 - 单次执行控制:通过
compareAndSet(false, true),只有第一次进入RESUMED状态时,标记会从false更新为true,后续再进入RESUMED时,条件不满足,不会重复执行任务。
替代方案(无需标记)
如果你不想维护额外的标记变量,也可以在任务执行完成后直接取消外层协程,彻底终止repeatOnLifecycle的监听:
lifecycleScope.launch { repeatOnLifecycle(Lifecycle.State.RESUMED) { // 执行单次任务 doOneTimeTask() // 任务完成后取消外层协程,不再监听生命周期变化 this@launch.cancel() } }
这个方案的特点是,任务执行完成后就不再监听RESUMED状态,适合不需要后续生命周期感知的场景。
内容的提问来源于stack exchange,提问作者Mark George
相关产品推荐
相关产品推荐

