Я пытаюсь использовать Kotlin сопрограммы для асинхронной записи данных в базу данных Realm со следующим кодом:
suspend fun write(realmObject): Unit = with(realmDatabase) {
beginTransaction()
insertOrUpdate(realmObject)
commitTransaction()
}
Я вызываю метод записи в моем репозитории:
suspend fun insertALotOfObjects() {
for (i in 0..1000) {
val realmObjectToInsert = SampleRealmObject(id = i)
realmRepository.write(realmObjectToInsert)
}
}
И я использую свой репозиторий внутри ViewModel следующим образом:
viewModelScope.launch(Dispatchers.IO) {
repository.insertALotOfObjects()
}
Каждый раз, когда я запускаю свою ViewModel, и нажимаю кнопку, которая запускает сопрограмму базы данных, пользовательский интерфейс полностью зависает до такой степени, что даже состояние кнопки не обновляется и зависает с отображением эффекта пульсации после щелчка, пока операции с базой данных не будут завершены. Когда сопрограмма завершена, пользовательский интерфейс возвращается в нормальное состояние и снова становится отзывчивым.
Я зарегистрировал Thread.currentThread()
вывод внутри всех этих вызовов, и текущее значение потока всегда Thread[DefaultDispatcher-worker-1,5,main]
, поэтому сопрограмма на самом деле работает в рабочем потоке.
Почему это происходит? Разве пользовательский интерфейс не должен блокироваться только тогда, когда UiThread
или MainThread
используются для вызова сопрограммы? Как я могу решить эту проблему и сделать пользовательский интерфейс адаптивным во время работы сопрограммы?