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

标签 kotlin kotlinx.coroutines anko

我开始使用 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/

相关文章:

android - 你如何让 Idling 资源在 Kotlin 中与协程一起工作

机器人 Kotlin : locale des not change after back press

android - 协程异常抛出 KotlinNullPointerException

kotlinx.coroutines - kotlin 协程 - 在协程内部调用时,如何确保某些命令在 UI 主线程上运行?

android - 程序类型已经存在 : kotlinx. coroutines.experimental.EventLoopBase

android - 在带有 ProGuard 的 Android Instrumentation 测试中使用 Kotlin 协程

android - Kotlin/Anko 防止按钮关闭警报对话框

android - Anko 对话框按钮标题

android - 与 Dagger 一起使用时,Espresso 生成 FileNotFoundException

java - 所有分区的 seekToEnd 并在 Kafka 消费者的自动重新平衡中幸存下来