Android RxJava - 调用多个单一直到条件和 return 单一

Android RxJava - call multiple single until condition and return a single

我被困在一个简单的任务上,我很确定我走错了路。 我只需要获取项目列表。我只能得到 50 的项目,我不知道确切的页数。

所以我需要做的是调用并重复调用直到我得到的项目少于 50 个(这意味着它是最后一页),然后 return 完整列表并在数据库中插入

api电话打单,我要return打单。 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.IllegalArgumentException: 序列包含一个以上的元素!

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

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

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