Android RxJava:链接两个请求并在其间做一些逻辑
Android RxJava: Chaining two requests and doing some logic inbetween
您好,我正在尝试使用平面图创建网络请求链,但不太了解如何执行此操作的过程。
目标是这样做:
执行网络请求 1
一旦我从 networkRequestOne 获得结果,对该结果执行一些逻辑,然后执行下一个 networkRequestTwo 并使用从 networkRequestTwo 返回的响应值调用 onSuccess。
当前代码:
delegator.requestOne(requestData)
.flatMap ({ response ->
if(response.isSuccessful){
cookieStorage.saveSessionCookies(response.header(cookieStorage.COOKIE_HEADER_NAME)!!)
}
return delegator.requestTwo
})
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe(object : SingleObserver<ResponseTwo>() {
@Override
fun onSubscribe(Disposable d) {
}
@Override
fun onSuccess(responseTwo :ResponseTwo) {
callback.onSuccess(responseTwo)
}
@Override
public void onError(Throwable e) {
}
});
delegator.requestOne 和 delegator.requestTwo 都连接到 returns 单个可观察对象
的改造调用
这有点奇怪,您需要在 subscribe
方法中调用回调。如果您已经有了 Rx,为什么还需要 cb?如果你 return a Single
和 运行 你实际订阅的回调代码会更清楚:
...
// don't forget to handle the `disposable`
doSmth(requestData)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
{ success -> /* here's your success callback code */},
{ error -> /* handle error here */}
)
...
fun doSmth(requestData: RequestData): Single<ResponseTwo> = delegator.requestOne(requestData)
.doOnSuccess(::updateCookies)
// you can extract the data you need from the first request using `it`
.flatMap { delegator.requestTwo() }
fun updateCookies(response: Response<ResponseOne>) {
val cookie = response.header(cookieStorage.COOKIE_HEADER_NAME)!!
cookieStorage.saveSessionCookies(cookie)
}
更新
如果你还需要callback
:
// don't forget to handle the `disposable`
delegator.requestOne(requestData)
.doOnSuccess(::updateCookies)
.flatMap { delegator.requestTwo() }
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe(
{ success -> callback.onSuccess(success) },
{ error -> callback.onError(error) }
)
fun updateCookies(response: Response<ResponseOne>) {
if (response.isSuccessful) {
val cookie = response.header(cookieStorage.COOKIE_HEADER_NAME)!!
cookieStorage.saveSessionCookies(cookie)
}
}
您好,我正在尝试使用平面图创建网络请求链,但不太了解如何执行此操作的过程。
目标是这样做:
执行网络请求 1 一旦我从 networkRequestOne 获得结果,对该结果执行一些逻辑,然后执行下一个 networkRequestTwo 并使用从 networkRequestTwo 返回的响应值调用 onSuccess。
当前代码:
delegator.requestOne(requestData)
.flatMap ({ response ->
if(response.isSuccessful){
cookieStorage.saveSessionCookies(response.header(cookieStorage.COOKIE_HEADER_NAME)!!)
}
return delegator.requestTwo
})
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe(object : SingleObserver<ResponseTwo>() {
@Override
fun onSubscribe(Disposable d) {
}
@Override
fun onSuccess(responseTwo :ResponseTwo) {
callback.onSuccess(responseTwo)
}
@Override
public void onError(Throwable e) {
}
});
delegator.requestOne 和 delegator.requestTwo 都连接到 returns 单个可观察对象
的改造调用这有点奇怪,您需要在 subscribe
方法中调用回调。如果您已经有了 Rx,为什么还需要 cb?如果你 return a Single
和 运行 你实际订阅的回调代码会更清楚:
...
// don't forget to handle the `disposable`
doSmth(requestData)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
{ success -> /* here's your success callback code */},
{ error -> /* handle error here */}
)
...
fun doSmth(requestData: RequestData): Single<ResponseTwo> = delegator.requestOne(requestData)
.doOnSuccess(::updateCookies)
// you can extract the data you need from the first request using `it`
.flatMap { delegator.requestTwo() }
fun updateCookies(response: Response<ResponseOne>) {
val cookie = response.header(cookieStorage.COOKIE_HEADER_NAME)!!
cookieStorage.saveSessionCookies(cookie)
}
更新
如果你还需要callback
:
// don't forget to handle the `disposable`
delegator.requestOne(requestData)
.doOnSuccess(::updateCookies)
.flatMap { delegator.requestTwo() }
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe(
{ success -> callback.onSuccess(success) },
{ error -> callback.onError(error) }
)
fun updateCookies(response: Response<ResponseOne>) {
if (response.isSuccessful) {
val cookie = response.header(cookieStorage.COOKIE_HEADER_NAME)!!
cookieStorage.saveSessionCookies(cookie)
}
}