当它仍处于实验阶段时,我开始使用corotuines。使用anko
,我得到了
async(UI) {
val request = bg { sendRequest() }
val result = request.await()
// UI work
}
我真的很喜欢它的结构,它确实提供了更干净的代码,而不是回调地狱imo。我只是意识到协程现在处于稳定的渠道,迫不及待想尝试一下。我更新了Kotlin和Anko,现在有了这个
doAsync {
val result = sendRequest()
uiThread {
// ui work
}
}
我做对了吗?在我看来,这种结构很难看。尽管它可能更具可读性,但是我仍然喜欢调用await()
的旧方法。也许我在这里想念什么?我记得引入coroutines
的卖点之一就是花括号少了。
答案 0 :(得分:2)
您不需要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
...
}
要获得更多见识,强烈建议阅读Roman Elizarov的Explicit Concurrency。