Cómo mostrar correctamente el progreso de las tareas asíncronas utilizadas por la Sala de Google

Estoy usando Google Room para implementar la persistencia de datos en mi aplicación de Android (código de Kotlin). La sala exige que todas las operaciones (consultas hacia y desde la database) sean asincrónicas. Me gustaría que el usuario espere a que se ejecute la operación, evitando que interactúe con componentes que no se configurarían correctamente antes del final de la consulta. ¿Cómo puedo lograr esto, ya que no puedo acceder al hilo de UI desde una tarea asíncrona?

PD: también realizo algunas llamadas a una API donde sería agradable tener el indicador de progreso / carga. Estoy usando RxJava en esas llamadas, pero soy bastante nuevo en esta tecnología, y no estoy seguro de cómo estructurarla adecuadamente.

Muestra de una operación de 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 } }) } 

Solutions Collecting From Web of "Cómo mostrar correctamente el progreso de las tareas asíncronas utilizadas por la Sala de Google"

Para evitar que el usuario use la aplicación mientras la búsqueda funciona, puede usar una biblioteca como KProgressHUD para mostrar una interfaz de usuario modal que bloquea el HUD, que opcionalmente puede include un indicador de progreso. Solo necesita replace el show progress indicator here del show progress indicator here comentar con la creación modal del HUD y //dismiss progress indicator here con la eliminación del HUD en el hilo de la interfaz de usuario.

Con respecto al progreso, debe actualizar manualmente el progreso del HUD dentro de su código de execute . Primero, debe dividir su findAll() dao findAll() en una que devuelva la cantidad de elementos que tiene en total (alguna consulta SELECT COUNT(*) ) para saber cuánto time puede durar la barra de progreso total. Entonces, en lugar de findAll() , necesitaría crear llamadas por lotes / paginado a la database, obteniendo N loggings en un bucle. Dentro de este ciclo, puede actualizar el HUD con el porcentaje del progreso de su ciclo actual frente al recuento total que obtuvo antes de comenzar.

No estoy familiarizado con la API de la sala, por lo que no puedo proporcionar ningún pseudo código en dicho bucle, pero generalmente todo se networkinguce a abrir un cursor SQL y seguir buscando lotes de datos en un bucle hasta que se agote, manteniendo seguimiento de cuántos artículos ha leído y acumularlos en una list.