【问题标题】:Android RxJava - call multiple single until condition and return a singleAndroid RxJava - 调用多个单直到条件并返回一个
【发布时间】:2020-02-18 13:01:14
【问题描述】:

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

所以我需要做的是拨打电话并重复它,直到我得到少于 50 个项目(这意味着它是最后一页),然后返回完整的列表并在 db 中插入

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.IllegalArgumentException:序列包含多个元素!

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

【问题讨论】:

  • 也发布您的 api 调用代码?你在使用 mvvm 模式吗?
  • 是的,我正在使用 mvvm 模式!调用是在存储库中进行的

标签: android rx-java2


【解决方案1】:

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

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

【讨论】:

  • 谢谢伙计,flatMapIterable + toList 正是我想要的!
猜你喜欢
  • 2017-11-19
  • 1970-01-01
  • 1970-01-01
  • 2021-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-22
  • 1970-01-01
相关资源
最近更新 更多