为了账号安全,请及时绑定邮箱和手机立即绑定

按顺序发出具有不同请求正文的多个 API 请求

按顺序发出具有不同请求正文的多个 API 请求

LEATH 2021-09-29 15:30:08
用例:我需要使用 android 客户端(改造)在服务器中发送一些请求。在我得到第一个答案后,我需要更新发送对象值(取决于我得到的最后一个项目)并重新发送它,直到所有数据都下载完毕。我想知道如何使用 Retrofit 和 RxJava 实现这一点(我不想使用 while 循环等)编辑:问题是,我不知道“平面地图”的确切数量,因为数据可能会变大或变小。我有 420000 条记录,对于每个请求,我都下载 1000 条数据
查看完整描述

2 回答

?
12345678_0001

TA贡献1802条经验 获得超5个赞

您可以使用flatMap它们,并在下一个中使用它的响应,通过使用it参数,这是前一个的响应。


mathApi.multiplyByTwo(1)

    .flatMap {

        mathApi.multiplyByTwo(it)

    }.flatMap {

        mathApi.multiplyByTwo(it)

    }.subscribe {

        // here "it" will be 4 (1*2*2) 

    }

如果您不知道flatMap最终会有多少个s,例如,您可以使用递归函数来完成。


private fun multiplyByTwo(number: Int) {

    mathApi.multiplyByTwo(number).subscribe {

        if (it < Integer.MAX_VALUE) { // When you run out of data.

            multiplyByTwo(it)

        }

    }

}


查看完整回答
反对 回复 2021-09-29
?
牛魔王的故事

TA贡献1830条经验 获得超3个赞

您可以使用保存可变状态的 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()

        }

    })


查看完整回答
反对 回复 2021-09-29
  • 2 回答
  • 0 关注
  • 167 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信