RxJava - 有点复杂的API请求,以及进度的详细信息



首先,我只玩了几天RxJava/RxAndroid。

在伪代码中,我试图在从激战 2 API 加载数据时完成这样的事情:

refreshDatabase {
getAllIds - single API call (50.000+ ids)
chunk ids into chunks of 100 each
for each chunk
getItems - single API call which fetches 100 items
update ui on the progress (# chunks out of # chunks done)
loop through all items when all chunks are fetched
determine if the item is something we're after
save it in our own database
update ui on progress (# items out of # items done)
return bool telling if successful or not
}

我已经阅读了很多关于它的教程和文档,但我并没有真正掌握如何编写代码。

如果我希望在获取块后直接运行对数据库的排序/保存,我已经完成了所有这些工作逻辑,但是我无法使用详细信息更新 UI。

由于这是一个在第一次运行时需要相当长一段时间的操作,我希望进度非常详细,而不是节省 .5-2 秒的加载时间。

关于我如何获得的任何提示,就像我放入伪代码一样?

划分征服。

您实际上有 2 或 3 个不同的操作,因此不要尝试在一个函数中执行此操作。

首先,您应该使用AndroidX Jetpack的工作管理器来执行本地数据库的同步,以及用于读取和写入本地SQLite数据库的空间。

从获取所有相关项目并将它们存储在数据库中开始(此处不执行 UI udpates(:

class MyRepository(private val api: MyApi, private val dao:MyItemDao) {
fun isItemInteresting(item: Item): Boolean {
return true
}
fun fetchAllInterestingItems(): Single<List<Item>> {
return api.getAllIds()
.flatMapIterable { it }
.buffer(100)
.flatMap { api.getItems(it) }
.flatMapIterable { it }
.filter { isItemInteresting(it) }
.toList()
}
fun updateDatabase(items: List<Item>): Completable {
return dao.storeItems(items)
}
}
class SyncWorker(
context: Context,
params: WorkerParameters,
private val repository: MyRepository
) : RxWorker(context, params) {
override fun createWork(): Single<Result> {
return repository.fetchAllInterestingItems()
.flatMapCompletable { repository.updateDatabase(it) }
.subscribeOn(Schedulers.io())
.toSingle { Result.success()}
}
}

这将获取所有项目,检查哪些是相关的,并将它们存储在您的数据库中(MyApi将是一个改造接口,MyItemDao是一个Room Dao接口(。

可以通过WorkManager(版本 2.3.0,当前处于测试阶段(中的进度报告 API 向 UI 报告进度。

相关内容

  • 没有找到相关文章

最新更新