kotlin 1.3中使用协同程序的正确方法

kotlin 1.3中使用协同程序的正确方法,kotlin,kotlinx.coroutines,anko,Kotlin,Kotlinx.coroutines,Anko,我开始使用corotuines的时候它还处于实验阶段。有了anko,我就有了 async(UI) { val request = bg { sendRequest() } val result = request.await() // UI work } 我真的很喜欢它的结构,它确实提供了更干净的代码,而不是回调地狱。我刚刚意识到协同路由现在处于稳定通道中,迫不及待地想尝试它。我更新了我的kotlin和anko现在我有了这个 doAsync { val resu

我开始使用corotuines的时候它还处于实验阶段。有了anko,我就有了

async(UI) {
    val request = bg { sendRequest() }
    val result = request.await()
    // UI work
}
我真的很喜欢它的结构,它确实提供了更干净的代码,而不是回调地狱。我刚刚意识到协同路由现在处于稳定通道中,迫不及待地想尝试它。我更新了我的kotlin和anko现在我有了这个

doAsync {
    val result = sendRequest()
    uiThread {
        // ui work
    }
}

我做得对吗?我觉得这个结构很难看。虽然它可能更可读,但我仍然喜欢调用
await()
的旧方法。或者我错过了什么?我记得
coroutines
推出时的一个卖点是少花括号。

你不需要Anko就可以用coroutines获得好的代码。此外,您不需要使用
async
,事实上,对于像您这样只想进行非阻塞调用而不想同时启动多个此类调用的情况,您应该避免使用它。你的基本习惯用语应该是

myScope.launch {
    val result = sendRequest()
    // UI work
}
其中
sendRequest()

suspend fun sendRequest() = withContext(Dispatchers.IO) { ... body ... }
如果您是从安卓
活动
调用此函数,则
myScope
可能只是隐式
this
,并且您的活动必须实现
CoroutineScope

class MyActivity : AppCompatActivity, CoroutineScope {
    override val coroutineContext = SupervisorJob() + Dispatchers.Main
    ...
}

要获得更多见解,强烈推荐阅读罗曼·艾利扎洛夫的著作。

谢谢您的建议。这听起来是个好主意,但我仍然喜欢使用协同程序的老方法。这样,我就不需要返回并修改我的所有请求方法以挂起。如果您的请求方法不可挂起,那么您必须将其调用包装到带有上下文的
中。在其基本效果上,这与在
async
中包装相同,并立即
等待它,但在遇到故障时行为正确。因此,在任何情况下,您都应该避免使用
async wait
,当您想要实现并发性时,应该严格使用它(而不仅仅是避免阻塞UI线程)。