我尝试使用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)
}
}viewModelScope.launch(Dispatchers.IO) {
repository.insertALotOfObjects()
}每次我运行ViewModel并单击启动数据库协程的按钮时,UI都会完全冻结,甚至按钮状态都不会更新,并且会一直显示单击后的涟漪效果,直到数据库操作完成。当协程结束时,UI返回到正常状态并再次响应。
我已经在所有这些调用中记录了Thread.currentThread()输出,并且当前线程值总是Thread[DefaultDispatcher-worker-1,5,main],所以协程实际上是在工作线程中运行的。
为什么会发生这种情况?是否应该仅在使用UiThread或MainThread调用协程时才阻止UI?我如何解决这个问题,并使UI响应,而协程正在运行?
发布于 2020-10-15 04:13:17
您每次都会在循环中创建一个新事务。相反,您可以创建one事务,并在其中多次执行write操作。
https://stackoverflow.com/questions/61618591
复制相似问题