我如何 return Kotlin 中的等待值?

How can I return an awaited value in Kotlin?

我需要 test() 到 return 我数据库中的播放器。我知道我可以使用回调,但如何使用 async await?

fun test(): Player {
    launch(UI) {
        val player = async(CommonPool) { MainActivity.database?.playerDao()!!.loadPlayer() }.await()
        return player
    }
}

目前错误是return is not allowed here

例如,在 JavaScript 中,我会制作 test async 然后 await 它是调用它的地方的结果。

无法在原始线程上 运行 协程。至少,您必须将一个现有的线程变成一个旋转顶级事件循环的线程。您可以通过在线程调用堆栈的最顶部(即在其 run() 方法内)调用 runBlocking 来实现此目的。

在 GUI 线程或 运行 是事件循环的任何其他类型的线程上,您需要一个匹配的 Dispatcher 将协程提交到此事件循环。 Kotlin 已经为 Swing、JavaFX、Android 等提供了调度程序。在这些情况下,您需要 launch 来自某些现有 GUI 事件处理程序的协程,如下所示:

myScope.launch {
    val player = test()
    ... use the player ...
}

myScope 必须是一个实现 CoroutineScope 的对象,类似这样:

override val coroutineContext = Dispatchers.Main + SupervisorJob()

这将为您提供一种方法,通过调用

彻底取消同一范围内的所有协程 运行ning
coroutineContext[Job]!!.cancel()

我的示例使用 Main 调度程序,当您导入与您的 UI 框架匹配的 Kotlin 协程库时,它会解析为 GUI 线程。

test() 函数必须成为 suspend fun 临时将调度程序切换到线程池以进行阻塞操作。下面是一个基本示例:

suspend fun test() = withContext(Dispatchers.IO) {
    MainActivity.database?.playerDao()!!.loadPlayer()
}

最后,请注意我在这个答案中根本没有提到 async。 Kotlin 的 async 有一个非常特殊的目的,它不像其他语言那样是一个通用的工具。它的目的是严格并行分解,将单个任务分解为多个并发子任务。