【发布时间】:2020-04-19 19:20:18
【问题描述】:
我正在使用房间数据库来运行一些繁重的数据库操作。我没有将 LiveData 用于此操作,因为我仅将结果用于计算。现在如果在我的主要片段中我有这个
override fun onActivityCreated(savedInstanceState: Bundle?) {
lifecycleScope.launch {
val result = viewModel.someHeavyOperation() // a suspend fun
doSomething(result)
}
}
我在启动时收到Skipped xx frames! Your application might be doing to much work on main thread.,如果我忽略数据库查询,我不会收到。
现在这里的一些答案,如 this one 或 that one 似乎建议在 IO 线程上运行查询,如
override fun onActivityCreated(savedInstanceState: Bundle?) {
lifecycleScope.launch {
withContext(Dispatchers.IO) {
val result = viewModel.someHeavyOperation() // a suspend fun
}
doSomething(result)
}
}
这确实提高了我的表现。让我感到困惑的是,Android 开发者在媒体上发布的 an article 中写道
注意:Room 使用自己的调度程序在后台线程上运行查询。您的代码不应使用 withContext(Dispatchers.IO) 来调用暂停房间查询。它会使代码复杂化并使您的查询运行速度变慢。
但是,他们似乎只考虑了昂贵的位是随后的计算的情况,他们似乎提出了类似的建议
override fun onActivityCreated(savedInstanceState: Bundle?) {
lifecycleScope.launch {
val result = viewModel.someOperation() // a suspend fun
withContext(Dispatchers.Default) {
doSomethingHeavy(result)
}
}
}
现在我的问题是:
- 如果房间仍然使用自定义调度程序,那么调用哪个调度程序房间查询又有什么关系?
- 如何在不阻塞主线程的情况下执行昂贵的房间查询?
【问题讨论】:
标签: android kotlin android-room