gpt4 book ai didi

android - Kotlin 协程 `runBlocking`

转载 作者:IT老高 更新时间:2023-10-28 13:40:58 28 4
gpt4 key购买 nike

我正在学习 Kotlin 协程。我读过 runBlocking 是桥接同步和异步代码的方法。但是如果 runBlocking 停止 UI 线程,性能提升是多少?比如我需要在Android中查询一个数据库:

    val result: Int
get() = runBlocking { queryDatabase().await() }

private fun queryDatabase(): Deferred<Int> {
return async {
var cursor: Cursor? = null
var queryResult: Int = 0
val sqlQuery = "SELECT COUNT(ID) FROM TABLE..."
try {
cursor = getHelper().readableDatabase.query(sqlQuery)
cursor?.moveToFirst()
queryResult = cursor?.getInt(0) ?: 0
} catch (e: Exception) {
Log.e(TAG, e.localizedMessage)
} finally {
cursor?.close()
}
return@async queryResult
}
}

查询数据库会停止主线程,所以看起来它需要与同步代码相同的时间?如果我遗漏了什么,请纠正我。

最佳答案

runBlocking is the way to bridge synchronous and asynchronous code

我经常碰到这个短语,它非常具有误导性。

runBlocking 几乎从不是您在生产中使用的工具。它取消了协程的异步、非阻塞特性。如果您碰巧已经有一些基于协程的代码想要在协程不提供任何值(value)的上下文中使用:在阻塞调用中,您可以使用它。一种典型的用途是 JUnit 测试,其中测试方法必须坐下来等待协程完成。

你也可以在你的 main 方法中玩协程时使用它。

runBlocking 的滥用已经变得如此普遍,以至于 Kotlin 团队实际上试图添加一个快速失败检查,如果你在 UI 线程上调用它会立即使你的代码崩溃。到他们这样做的时候,它已经破坏了很多代码,以至于他们不得不将其删除。

关于android - Kotlin 协程 `runBlocking`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52331373/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com