gpt4 book ai didi

android - 使用Kotlin Coroutines和Realm执行数据库写入会导致UI卡住

转载 作者:行者123 更新时间:2023-12-02 13:43:09 25 4
gpt4 key购买 nike

我正在尝试使用Kotlin Coroutines通过以下代码将数据异步写入Realm数据库:

suspend fun write(realmObject): Unit = with(realmDatabase) {
beginTransaction()
insertOrUpdate(realmObject)
commitTransaction()
}

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

suspend fun insertALotOfObjects() {
for (i in 0..1000) {
val realmObjectToInsert = SampleRealmObject(id = i)
realmRepository.write(realmObjectToInsert)
}
}

我以这种方式在ViewModel中使用我的存储库:

viewModelScope.launch(Dispatchers.IO) {
repository.insertALotOfObjects()
}

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

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

为什么会发生?仅当使用 UiThreadMainThread调用协程时才不应该阻塞UI吗?当协程运行时,如何解决此问题并使UI响应?

最佳答案

您每次都在循环中创建一个新事务。而是创建一个事务,并在其中进行write操作(所需次数)。

关于android - 使用Kotlin Coroutines和Realm执行数据库写入会导致UI卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61618591/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com