依次发出具有不同请求主体的多个API请求

时间:2018-09-20 07:26:19

标签: java android kotlin retrofit2 rx-java2

用例:我需要使用android客户端(改造)在服务器中发送一些请求。得到第一个答案后,我需要更新发送对象的值(取决于我得到的最后一个项目)并重新发送它,直到下载所有数据为止。我想知道如何使用Retrofit和RxJava(我不想使用while循环等)

编辑: 问题是,我不知道“平面图”的确切数量,因为数据可能会变大或变小。我有420000条记录,对于每个请求,我都会加载1000条数据

2 个答案:

答案 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()
        }
    })