我如何 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
有一个非常特殊的目的,它不像其他语言那样是一个通用的工具。它的目的是严格并行分解,将单个任务分解为多个并发子任务。
我需要 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()
这将为您提供一种方法,通过调用
彻底取消同一范围内的所有协程 运行ningcoroutineContext[Job]!!.cancel()
我的示例使用 Main
调度程序,当您导入与您的 UI 框架匹配的 Kotlin 协程库时,它会解析为 GUI 线程。
test()
函数必须成为 suspend fun
临时将调度程序切换到线程池以进行阻塞操作。下面是一个基本示例:
suspend fun test() = withContext(Dispatchers.IO) {
MainActivity.database?.playerDao()!!.loadPlayer()
}
最后,请注意我在这个答案中根本没有提到 async
。 Kotlin 的 async
有一个非常特殊的目的,它不像其他语言那样是一个通用的工具。它的目的是严格并行分解,将单个任务分解为多个并发子任务。