首页 > 解决方案 > 在 lambda 中调用 withContext(Dispatchers.Main) 时获取“只能在协程体内调用暂停函数”

问题描述

我正在使用下面的脚本创建一个协程:

fun bar(completion: () -> Unit) {
  GlobalScope.launch(Dispatchers.IO) {
    val lambda = {
      withContext(Dispatchers.Main) { //Suspension functions can be called only within coroutine body
        completion()
      }
    }
    foo(lambda)
  }
}

fun foo(lambda: () -> Unit) {
  //...do something heavy
  lambda()
}

Suspension functions can be called only within coroutine body但是当我调用时我得到了错误,withContext(Dispatchers.Main)因为 lambda 改变了上下文。我无法更改foo(lambda: () -> Unit)为,foo(lambda: suspend () -> Unit)因为它来自外部库。

知道我可以在上下文中withContext(Dispatchers.Main)创建的 lambda中调用什么吗?launch

谢谢!

标签: kotlinkotlin-coroutines

解决方案


你可以像这样重写你的bar函数:

fun bar(completion: () -> Unit) {
    GlobalScope.launch(Dispatchers.IO) {
        suspendCoroutine<Unit> {
            val lambda = {
                it.resume(Unit)
            }
            foo(lambda)
        }
        withContext(Dispatchers.Main) {
            completion()
        }
    }
}


推荐阅读