如何解决启动协程时出现“无法访问主线程上的数据库,因为它可能会长时间锁定 UI”错误
我收到此错误:无法访问主线程上的数据库,因为它可能会长时间锁定 UI。 当我在 ViewModel(下面的代码)中启动 fun turnAllWordsOn() 时会发生这种情况。这个函数启动协程,我认为协程总是在后台线程上工作。那么为什么我会收到这个错误呢? 感谢任何帮助
在片段中:
override fun onOptionsItemSelected(item: MenuItem): Boolean {
return when (item.itemId) {
R.id.action_turn_all_words_on -> {
viewModel.turnAllWordsOn()
true
}
// othes items
}
在视图模型中:
fun turnAllWordsOn() = viewModelScope.launch {
wordDao.turnAllWordsOn()
}
在道中:
@Query("UPDATE word_table SET shown = 1")
fun turnAllWordsOn()
解决方法
如果你想让 Room 在后台线程上运行它,你必须将你的 Dao 函数标记为挂起函数。否则,您所做的只是从协程范围调用同步函数。
@Query("UPDATE word_table SET shown = 1")
suspend fun turnAllWordsOn()
顺便提一下,挂起函数不会自动在后台线程上运行,但是当您将查询标记为挂起时,Room 会在后台执行必要的工作。
,即使你有了答案,我还是想给出一些解决方法和问题的原因, 执行联网,或者访问数据库都可以阻塞Ui线程,所以可以使用
-
使用 RxJava:
Completable.fromAction { wordDao.turnAllWordsOn() }
-
使用协程:
@Query("更新 word_table SET 显示 = 1") 暂停乐趣 turnAllWordsOn()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。