我有三个函数,让我们称它们为A(),B()和C()。A和C是包含对async.await()的调用的函数,因此必须从协程中调用它们。功能B显示UI对话框,其返回值取决于功能C.
我最初尝试了以下内容:
fun main() = launch {
A()
val value = B()
C(value)
}
发生的是函数A被调用,然后是函数B,然后在等待函数B返回之前立即调用函数C. 我究竟做错了什么?
发布于 2019-02-20 10:09:47
您可能希望suspendCoroutine{..}
从函数中调用该函数B()
以使其等待关闭对话框,因此您具有该值。此外,可能需要确保从UI线程显示对话框。withContext{..}
来自kotlinx.coroutines的函数应该有帮助
我看到以下解决方案:
fun main() = Dispatchers.Default.launch {
A()
val value = withContext(Dispatchers.Swing) {
suspendCoroutine { cont ->
showDialogFromB(cont)
}
}
C(value)
}
cont
具有类型Continuation<T>
,T是该类型value
。界面有2个功能 - result(T)
和resumeWithException(Throwable)
。您可以下标对话框内部以调用其中一种方法。可能最好调用resumeWithException
when对话框取消。该suspendCoroutine
函数将暂停执行,释放堆栈。对cont
函数的调用将恢复执行
https://stackoverflow.com/questions/-100006369
复制相似问题