Выполнение записи в базу данных с помощью Kotlin Coroutines и Realm вызывает зависание пользовательского интерфейса - PullRequest
0 голосов
/ 05 мая 2020

Я пытаюсь использовать 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 используются для вызова сопрограммы? Как я могу решить эту проблему и сделать пользовательский интерфейс адаптивным во время работы сопрограммы?

...