Unit) { GlobalScope.launch(Dispatchers.IO) { val l-6ren">
gpt4 book ai didi

kotlin - 在 lambda 内调用 withContext(Dispatchers.Main) 时获取 "Suspension functions can be called only within coroutine body"

转载 作者:行者123 更新时间:2023-12-01 18:35:36 24 4
gpt4 key购买 nike

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

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

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

知道如何在 launch 上下文中创建的 lambda 中调用 withContext(Dispatchers.Main) 吗?

  • Kotlin 版本:1.3.41
  • 协程:1.3.0-RC

谢谢!

最佳答案

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

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

关于kotlin - 在 lambda 内调用 withContext(Dispatchers.Main) 时获取 "Suspension functions can be called only within coroutine body",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57329658/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com