官方的Android文档表示不建议使用allowMainThreadQueries()
,因为它可能会长时间锁定UI并触发ANR。
但是Kotlin协程使我们能够在主线程中执行某些操作而不会有效地阻塞UI。
因此我想问:在主线程上运行的couroutine范围内使用allowMainThreadQueries()
并访问数据库是否安全? 就像下面这样:
// 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
,那么您可以选择第一种方法,否则选择第二种方法。 - Sergio