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

Kotlin协程需求:实现带延迟的循环直至硬件初始化完成

Kotlin协程实现硬件初始化轮询的正确写法

你的代码问题解析

你担心delay无法保证Dispatchers.Main上的代码执行完成,其实这个顾虑是多余的:withContext是挂起函数,当协程执行到withContext(Dispatchers.Main)时,会切换到主线程执行块内代码,并且会等待整个块内代码执行完毕后,才会继续执行后续的delay(50)。所以你的代码里,readRfPower()和unlockRfControlWidgets()肯定会在done = true执行完成后,才会走到下一行的delay。

不过你的代码可以简化,不需要额外的done变量,直接用break跳出循环即可。

优化后的代码实现

对应「先检测再delay」的逻辑

lifecycleScope.launch(Dispatchers.IO) {
    while (true) {
        if (mainActivity!!.isRfInitialized) {
            // 切换到主线程执行UI操作,等待执行完成
            withContext(Dispatchers.Main) {
                readRfPower()
                unlockRfControlWidgets()
            }
            // UI操作完成后直接跳出循环
            break
        }
        delay(50)
    }
}

对应「先delay再检测」的逻辑

lifecycleScope.launch(Dispatchers.IO) {
    while (true) {
        delay(50)
        if (mainActivity!!.isRfInitialized) {
            withContext(Dispatchers.Main) {
                readRfPower()
                unlockRfControlWidgets()
            }
            break
        }
    }
}

适配需求背景的补充说明

  1. 用lifecycleScope非常合适:Fragment销毁时,协程会自动取消,不会出现内存泄漏或者无效的UI操作。
  2. 无需担心硬件初始化完成时Fragment不存在的问题:如果Fragment已销毁,lifecycleScope的协程会被取消,不会执行后续UI代码;如果Fragment仍存活,协程会继续轮询直到检测到初始化完成。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 20:50:35