Как правильно показать прогресс асинхронных задач, используемых Google Room

Я использую Google Room для реализации сохранения данных в своем приложении для Android (код Котлина). Комната требует, чтобы все операции (запросы в базу данных и из базы данных) были асинхронными. Я хотел бы, чтобы пользователь дождался выполнения операции, не позволяя ему взаимодействовать с компонентами, которые не были бы настроены должным образом до конца запроса. Как я могу достичь этого, так как я не могу получить доступ к потоку пользовательского интерфейса из задачи async?

PS: Я также звоню в API, где индикатор прогресса / загрузки будет приятным. Я использую RxJava в этих вызовах, но я довольно новичок в этой технологии, и я не уверен, как правильно ее структурировать.

Пример операции db:

private fun getDataFromCache() { //show progress indicator here execute({ try { //Get items from cache val entities = daoData.findAll() if (entities.isNotEmpty()) { //do something } else { //do something else } } catch (e: Exception){ Log.e("error", e.toString()) } finally{ //dismiss progress indicator here } }) } 

Чтобы пользователь не мог использовать приложение во время работы fetch, вы можете использовать такую ​​библиотеку, как KProgressHUD, для отображения модального, блокирующего HUD интерфейса пользователя, который может дополнительно включать индикатор прогресса. Вам нужно только заменить show progress indicator here комментарием с помощью модального создания HUD и //dismiss progress indicator here с удалением HUD в потоке пользовательского интерфейса.

Что касается прогресса, вам необходимо вручную обновить ход HUD внутри вашего кода execute . Сначала вам нужно разделить вызов dao findAll() на один, который возвращает количество элементов, которые у вас есть в целом (некоторый запрос SELECT COUNT(*) ), чтобы узнать, как долго может быть общий индикатор выполнения. Затем вместо findAll() вам необходимо создать пакетные / вызывные вызовы в базу данных, извлекая N записей в цикле. Внутри этого цикла вы можете затем обновить HUD процент вашего текущего хода петли против общего количества, которое вы получили до начала.

Я не знаком с API-интерфейсом Room, поэтому я не могу предоставить псевдо-код в таком цикле, но обычно все это сводится к открытию курсора SQL и продолжению сбора партий данных в цикле до тех пор, пока он не будет исчерпан, сохраняя отслеживать, сколько у вас есть предметов, которые вы читали, и накапливать их в списке.