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

Kotlin协程:如何切换至UI线程并等待用户回调

解决方案

核心问题在于弹窗必须在UI线程(Main调度器)中创建显示,但你的suspendCoroutine块当前运行在调用它的后台线程里。只需先切换到Main上下文执行弹窗逻辑,再通过suspendCoroutine挂起等待用户交互结果即可解决。

修改后的代码如下:

suspend fun showPopupYesNoAsync(title: String): Boolean {
    // 切换到UI线程执行弹窗操作
    return withContext(Dispatchers.Main) {
        suspendCoroutine { continuation ->
            openPopupYesNo(title = title) { tappedButton ->
                // 用户点击后恢复协程,结果自动传递回原后台线程
                continuation.resume(tappedButton.id == "Yes")
            }
        }
    }
}

关键逻辑说明:

  • withContext(Dispatchers.Main)强制将内部代码切换到UI线程执行,确保openPopupYesNo能正常创建弹窗。
  • suspendCoroutine在Main线程内负责挂起协程,等待用户点击回调触发resume,最终返回结果会自动切换回原调用的后台线程,不影响后续异步逻辑执行。
  • 无需在suspendCoroutine内部嵌套withContext,外层的上下文切换已经覆盖了内部代码的运行线程。

补充提示:

  • 确认openPopupYesNo本身支持在UI线程调用(绝大多数Android弹窗API都有此要求)。
  • 调用该suspend函数的后台协程会自动挂起,直到用户完成点击操作后才继续执行,完全满足“等待用户选择后再返回”的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 19:35:24