在Kotlin 1.3中使用协程的正确方法

时间:2018-11-24 01:32:23

标签: kotlin kotlinx.coroutines anko

当它仍处于实验阶段时,我开始使用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的卖点之一就是花括号少了。

1 个答案:

答案 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