如何正确显示Google房间使用的异步任务的进度

我使用Google Room来实现Android应用程序(Kotlin代码)中的数据持久性。 房间要求所有的操作(来自和来自数据库的查询)是异步的。 我希望用户等待操作执行,防止他在查询结束之前与不能正确配置的组件进行交互。 我怎么能做到这一点,因为我不能从异步任务访问UI线程?

PS:我也做了一些API调用进度/加载指标是很好的。 我在这些调用中使用RxJava,但是我对这项技术相当陌生,而且我不确定如何正确地构造它。

数据库操作示例:

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 } }) } 

为了防止用户在提取工作时使用应用程序,可以使用类似KProgressHUD的库来显示阻止HUD的模式用户界面,该用户界面可以选择包含进度指示器。 您只需要在show progress indicator here用模式HUD创建替换show progress indicator here并在//dismiss progress indicator here删除//dismiss progress indicator here同时移除UI线程上的HUD。

关于进度,您必须手动更新execute代码中的HUD进度。 首先,您需要将您的dao findAll()调用分解为一个返回总共有一些元素(某些SELECT COUNT(*)查询)的元素,以知道总进度栏可能会有多长时间。 然后,而不是findAll()您将需要创建批处理/分页调用数据库,获取循环中的N个记录。 在这个循环内,你可以使用当前循环进度的百分比来更新HUD,而不是在开始之前得到的总数。

我不熟悉Room API,所以我不能在这样的循环中提供任何伪代码,但通常都归结为打开一个SQL游标,并保持循环获取批处理数据直到耗尽,保持追踪有多少项目已经阅读并累积在列表中。