android - “无法访问主线程上的数据库,因为它可能会长时间锁定 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 会在后台执行必要的工作。
推荐阅读
- powershell - 从另一个 PS Session 调用进程的私有环境变量
- ruby-on-rails - 我已经在作者(has_many)和书籍(belongs_to)的rails中创建了一个关联,现在删除作者(依赖::destroy)后,我得到了异常
- sql - 为什么我在 SQL Server 'in' 子句中出现语法错误?
- flutter - 为什么在颤动中点击通知时路由不起作用?(项目基于GetX和flutter本地推送通知包)
- python - 如何在 Python 中使用 While 循环分析 CSV 文件数据
- aws-api-gateway - 如何在 Cognito 中允许访客访问
- wordpress - 使用 has_term 时不要在父项上显示产品类别子项
- go - Golang 访问 Gin.H 的元素
- c++ - 如何使用多线程确定性 PRNG
- ethereum - Solidity Factory Pattern - 测试脚本失败