我开始使用 corotuines 时它仍处于实验阶段。与 anko
,我有类似的东西
async(UI) {
val request = bg { sendRequest() }
val result = request.await()
// UI work
}
我真的很喜欢它的结构,它确实提供了更清晰的代码与回调 hell imo。我刚刚意识到协程现在处于稳定 channel ,迫不及待地想尝试一下。我更新了我的 kotlin 和 anko,现在我有了这个
doAsync {
val result = sendRequest()
uiThread {
// ui work
}
}
我做得对吗?这种结构对我来说似乎很丑陋。虽然它可能更具可读性,但我仍然喜欢旧的调用方式
await()
.或者我在这里错过了什么?我记得coroutines
时的卖点之一引入的是少花括号。
最佳答案
你不需要 Anko 就可以通过协程获得好的代码。另外,您不需要 async
事实上,对于像您这样的情况,您应该避免使用它,在这种情况下,您只想进行非阻塞调用,而不想同时启动多个此类调用。你的基本习语应该是
myScope.launch {
val result = sendRequest()
// UI work
}
哪里
sendRequest()
是suspend fun sendRequest() = withContext(Dispatchers.IO) { ... body ... }
如果您从 Android
Activity
调用此方法,然后 myScope
可以只是隐含的 this
,并且您的事件必须实现 CoroutineScope
:class MyActivity : AppCompatActivity, CoroutineScope {
override val coroutineContext = SupervisorJob() + Dispatchers.Main
...
}
要获得更多见解,Explicit Concurrency强烈推荐阅读 Roman Elizarov 的著作。
关于kotlin - 在 kotlin 1.3 中使用协程的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53454433/