Android RxJava-调用多个single直到条件并返回一个single



我被困在一项简单的任务上,我很确定我走错了路。我只需要拿一份物品清单。我只能在50之前拿到物品,我不知道确切的页数。

因此,我需要做的是打电话并重复,直到我得到的项目少于50个(这意味着这是最后一页(,然后在数据库中插入完整的列表

api调用是单个调用,我需要返回一个单个调用。Api呼叫:

@GET("posts")
fun getItems(@Query("page") page: Int, @Query("per_page") perPage: Int): Single<List<Item>>

这就是我目前所得到的:

fun getItems(): Single<List<Item>> {
var result = listOf<Item>()
return Observable.range(1, Integer.MAX_VALUE).concatMapSingle { page ->
remoteDataSource.getItems(page, 50).map {
result = it
it
}
}.repeatUntil {
result.size != 50
}.single(emptyList()).map {
localDataSource.insertItems(it)
it
}
}

问题是我在提取第二页时出错:java.lang.IollegalArgumentException:序列包含多个元素!

如何将每个调用附加到列表中,并在到达最后一页时发出该列表?例如,我应该将single改为flow吗?

您需要takeUntil来切断分页并重新累积所有单独的页面:

Observable.range(1, Integer.MAX_VALUE)
.concatMapSingle { page ->
remoteDataSource.getItems(page, 50)
}
.takeUntil {
it.size != 50
}
.flatMapIterable { it }
.toList()

相关内容

最新更新