kotlin - 在 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
- 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()
}
}
}
推荐阅读
- python - 创建一个函数来读取两个文本文件并从中绘制图表
- python - Django forms is_valid 在没有括号的情况下工作
- reactjs - 提交按钮是刷新页面而不是提交表单?(ReactJS 和 react-toastify)
- javascript - 如何使用类来触发多个元素 onmouseover 和 onclick 的功能?
- python - 如何使用 assertEqual 验证加载的 csv 中的行?
- ruby - 设置环境变量而不在字符串和整数之间进行转换
- python - 变量没有在我的函数内部声明?
- libtorch - Torch C++ (libtorch) 中是否提供概率分布?
- augmented-reality - 深度 API 支持的设备
- javascript - 无法读取未定义的属性“startsWith”