You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()
        }
    }
}

逻辑说明

  1. 原子布尔标记:AtomicBoolean保证在多线程环境下,标记的判断和更新操作是原子性的,避免重复执行的可能。
  2. repeatOnLifecycle的作用:确保协程仅在生命周期处于RESUMED状态时执行,离开RESUMED时会自动取消协程(和原launchWhenResumed的生命周期感知行为一致)。
  3. 单次执行控制:通过compareAndSet(false, true),只有第一次进入RESUMED状态时,标记会从false更新为true,后续再进入RESUMED时,条件不满足,不会重复执行任务。

替代方案(无需标记)

如果你不想维护额外的标记变量,也可以在任务执行完成后直接取消外层协程,彻底终止repeatOnLifecycle的监听:

lifecycleScope.launch {
    repeatOnLifecycle(Lifecycle.State.RESUMED) {
        // 执行单次任务
        doOneTimeTask()
        // 任务完成后取消外层协程,不再监听生命周期变化
        this@launch.cancel()
    }
}

这个方案的特点是,任务执行完成后就不再监听RESUMED状态,适合不需要后续生命周期感知的场景。

内容的提问来源于stack exchange,提问作者Mark George

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 00:52:19