【发布时间】:2019-06-28 02:25:25
【问题描述】:
Android 官方文档指出不推荐使用allowMainThreadQueries(),因为它可能会长时间锁定 UI 并触发 ANR。
但是 Kotlin 协程让我们可以在主线程中执行一些操作,而不会有效地阻塞 UI。
所以我要问:使用allowMainThreadQueries() 并在主线程上运行的 couroutine 范围内访问数据库是否安全?如下所示:
// WITH allowMainThreadQueries()
val activityJob = Job()
val mainScope = CoroutineScope(Dispatchers.Main + activityJob)
mainscope.launch {
// access room database and retrieve some data
// update UI with data retrived
}
或者我们应该坚持不允许主线程查询并在另一个线程中执行数据库查询的旧方式?
// WITHOUT allowMainThreadQueries()
val activityJob = Job()
val defaultScope = CoroutineScope(Dispatchers.Default + activityJob)
val mainScope = CoroutineScope(Dispatchers.Main + activityJob)
defaultScope.launch {
// access room database and retrieve some data
mainScope.launch {
// update UI with data retrived
}
}
我问是因为前一种方式(allowMainThreadQueries()):
- 更具可读性(我可以在访问数据库的函数的相同协程上下文中更新 UI,而无需在另一个协程范围内启动 UI 更新)
- 允许更简单的错误处理
- 只使用一个协程作用域(因此需要关心的作用域更少)
【问题讨论】:
-
如果数据库访问方法标记为
suspend,那么您可以使用第一种方法,否则第二种方法。
标签: android kotlin android-room kotlinx.coroutines