我正在学习线程和kotlin协程来同时加载我的UI和存储库,然后使用"withContext()“作为异步等待的替代方法。如果我正确理解了"withContext()“,并且它一个接一个地执行任务,等待前一个任务完成,为什么还要使用它呢?我还漏掉了什么概念吗?
发布于 2021-05-24 06:58:43
withContext是一个挂起函数,它允许在不同的协程上下文中执行特定的代码片段。当您想要在不同的dispatcher中执行某些操作时,它尤其有用。
例如,您可以让一些代码在具有多个线程的默认调度程序中运行,然后使用该代码生成的值来更新UI线程中的一些UI。在这种情况下,您不是在寻找并发性,默认dispatcher上的计算必须在更新UI之前进行,因为您需要结果:
val result = someComputation()
withContext(Dispatchers.Main) {
updateUI(result)
}当然,即使UI的计算和更新不是并发的,它们的顺序也可以与其他代码段并发:
scope.launch(Dispatchers.Default) {
val result = someComputation()
withContext(Dispatchers.Main) {
updateUI(result)
}
}如果你需要执行并发的东西,你可以使用像launch和async这样的协程构建器。然而,紧接着使用async { ... }和.await()就违背了并发的目的,因为async和await()调用之间的代码正是将与async的主体并发运行的代码:
val deferred = async { computeSomeValue() }
somethingConcurrentWithAsyncBody()
val result = deferred.await()您可以在文档中关于composing suspend functions的部分中阅读有关如何组织调用以实现并发的更多信息。
https://stackoverflow.com/questions/67665004
复制相似问题