首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Kotlin协程和Realm执行数据库写入会导致UI冻结

使用Kotlin协程和Realm执行数据库写入会导致UI冻结
EN

Stack Overflow用户
提问于 2020-05-06 00:55:28
回答 1查看 493关注 0票数 1

我尝试使用Kotlin Coroutines将数据异步写入Realm数据库,代码如下:

代码语言:javascript
复制
suspend fun write(realmObject): Unit = with(realmDatabase) {
    beginTransaction()
    insertOrUpdate(realmObject)
    commitTransaction()
}

我在我的存储库中调用write方法:

代码语言:javascript
复制
suspend fun insertALotOfObjects() {
    for (i in 0..1000) {
        val realmObjectToInsert = SampleRealmObject(id = i)
        realmRepository.write(realmObjectToInsert)
    }
}

代码语言:javascript
复制
viewModelScope.launch(Dispatchers.IO) {
    repository.insertALotOfObjects()
}

每次我运行ViewModel并单击启动数据库协程的按钮时,UI都会完全冻结,甚至按钮状态都不会更新,并且会一直显示单击后的涟漪效果,直到数据库操作完成。当协程结束时,UI返回到正常状态并再次响应。

我已经在所有这些调用中记录了Thread.currentThread()输出,并且当前线程值总是Thread[DefaultDispatcher-worker-1,5,main],所以协程实际上是在工作线程中运行的。

为什么会发生这种情况?是否应该仅在使用UiThreadMainThread调用协程时才阻止UI?我如何解决这个问题,并使UI响应,而协程正在运行?

EN

回答 1

Stack Overflow用户

发布于 2020-10-15 04:13:17

您每次都会在循环中创建一个新事务。相反,您可以创建one事务,并在其中多次执行write操作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61618591

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档