我有一个用Kotlin写的个人项目,我养成了非常慷慨地使用withContext(...)的习惯。在调用任何可能与I/O相关的内容时,我倾向于使用withContext(Dispatchers.IO)。
例如:
suspend fun getSomethingFromDatabase(db: AppDatabase) = withContext(Dispatchers.IO) {
return // ...
}
suspend fun doSomethingWithDatabaseItem(db: AppDatabase) {
val item = withContext(Dispatchers.IO) {
getSomethingFromDatabase(db)
}
// ...
}您可以在第二个函数中看到一个冗余的withContext(Dispatchers.IO)。我在这里非常谨慎,因为我可能不知道/记得getSomethingFromDatabase是否切换到适当的上下文。这会影响性能吗?这很糟糕吗?处理Dispatchers的惯用方法是什么
注意:我知道用这种方式在不同的上下文之间切换是非常好的,但是这个问题是关于使用相同的上下文的。
发布于 2021-08-23 13:17:00
除了调用需要特定上下文的代码之外,您不需要withContext。因此,只有在使用需要主线程的UI函数时,才应该使用withContext(Dispatchers.Main)。而且,只有在调用withContext(Dispatchers.IO)阻塞 IO相关代码时,才应该使用。
正确的挂起函数不阻塞(see section here),因此,您不应该指定调度程序来调用挂起函数。例外情况是,如果您使用的是其他人的代码或API,而他们使用的挂起函数不正确!
我不知道您的AppDatabase类是什么,但是如果设计合理,它将公开挂起函数而不是阻塞函数,因此您不需要withContext从它检索值。但是,如果它公开了用于检索项的阻塞函数,那么第一个函数的代码是正确的。
第二个函数肯定不需要withContext,因为它只是用来调用一个挂起函数。
至于使用冗余上下文是否可以,switching...it除了可能无故浪费一点点时间和内存、上下文切换和分配lambda之外,不会有任何伤害。它会降低代码的可读性。
https://stackoverflow.com/questions/68891909
复制相似问题