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()
我被困在一个简单的任务上,我很确定我走错了路。 我只需要获取项目列表。我只能得到 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()