用例:我需要使用android客户端(改造)在服务器中发送一些请求。得到第一个答案后,我需要更新发送对象的值(取决于我得到的最后一个项目)并重新发送它,直到下载所有数据为止。我想知道如何使用Retrofit和RxJava(我不想使用while循环等)
编辑: 问题是,我不知道“平面图”的确切数量,因为数据可能会变大或变小。我有420000条记录,对于每个请求,我都会加载1000条数据
答案 0 :(得分:3)
您可以使用flatMap
参数it
mathApi.multiplyByTwo(1)
.flatMap {
mathApi.multiplyByTwo(it)
}.flatMap {
mathApi.multiplyByTwo(it)
}.subscribe {
// here "it" will be 4 (1*2*2)
}
,并在下一个响应中使用它的响应。
flatMap
如果您不知道最终将拥有多少private fun multiplyByTwo(number: Int) {
mathApi.multiplyByTwo(number).subscribe {
if (it < Integer.MAX_VALUE) { // When you run out of data.
multiplyByTwo(it)
}
}
}
个,则可以使用递归函数来实现。
200
答案 1 :(得分:0)
您可以使用具有可变状态的generate函数:
data class ApiResponse(
val nextPage: Int? = null
)
data class GeneratorState(
var lastResponse: ApiResponse
)
fun makeApiCall(page: Int): ApiResponse {
return ApiResponse(page + 1)
}
Flowable
.generate(
Callable { GeneratorState(makeApiCall(0)) },
BiConsumer { state: GeneratorState, emitter: Emitter<ApiResponse> ->
val latest = state.lastResponse
if (latest.nextPage != null) {
val response = makeApiCall(latest.nextPage)
state.lastResponse = response
emitter.onNext(response)
} else {
emitter.onComplete()
}
})
.subscribe(object : FlowableSubscriber<ApiResponse> {
var subscription: Subscription? = null
override fun onSubscribe(s: Subscription) {
subscription = s
s.request(1)
}
override fun onNext(response: ApiResponse) {
println("onNext :$response")
if (response.nextPage != null && response.nextPage < 10) {
subscription?.request(1)
} else {
subscription?.cancel()
}
}
override fun onComplete() {
println("Completed")
}
override fun onError(t: Throwable) {
t.printStackTrace()
}
})