Android RxJava:链式双请求及中间逻辑实现技术咨询
用RxJava flatMap实现网络请求链式调用的正确姿势
嘿,我来帮你梳理清楚这个链式请求的实现逻辑,顺便修正你现有代码里的几个小问题~
首先,你要的核心流程是先执行requestOne → 处理返回结果(保存Cookie)→ 执行requestTwo → 把requestTwo的结果传给onSuccess回调,用flatMap来串联这两个Single请求是完全正确的思路——它的作用就是把第一个请求的结果转换成第二个请求的Observable(这里是Single),让两个请求按顺序执行。
现有代码的几个小问题
return delegator.requestTwo这里,如果你delegator.requestTwo是一个返回Single<ResponseTwo>的方法,那你需要调用它(也就是delegator.requestTwo()),而不是直接引用方法本身,不然返回的是方法对象而非Single实例,编译会报错。response.header(cookieStorage.COOKIE_HEADER_NAME)!!里的!!有潜在空指针风险,如果header不存在会直接崩溃,建议做非空安全处理。- 匿名内部类的写法可以用Kotlin lambda简化,代码会更清爽。
修正后的完整代码
delegator.requestOne(requestData) .flatMap { response -> // 处理第一个请求的结果:安全保存Cookie if (response.isSuccessful) { response.header(cookieStorage.COOKIE_HEADER_NAME)?.let { cookie -> cookieStorage.saveSessionCookies(cookie) } } // 返回第二个请求的Single,继续链式调用 delegator.requestTwo() } .subscribeOn(Schedulers.io()) // 指定所有上游请求在IO线程执行 .observeOn(AndroidSchedulers.mainThread()) // 指定下游回调在主线程执行 .subscribe( // onSuccess回调:把requestTwo的结果传给你的业务回调 { responseTwo -> callback.onSuccess(responseTwo) }, // onError回调:建议不要空着,处理请求过程中的异常 { error -> /* 比如在这里调用callback.onError(error),方便排查问题 */ } )
整个流程的详细拆解
- 发起第一个请求:
delegator.requestOne(requestData)返回Single<ResponseOne>,subscribeOn(Schedulers.io())指定这个请求在IO线程执行,避免阻塞主线程。 - flatMap串联第二个请求:当第一个请求成功返回
ResponseOne后,进入flatMap的lambda:- 先检查response是否成功,若成功则用
?.let安全获取Cookie头,存在的话就保存到cookieStorage。 - 接着返回
delegator.requestTwo(),RxJava会自动订阅这个新的Single,发起第二个网络请求。
- 先检查response是否成功,若成功则用
- 线程切换与结果处理:
observeOn(AndroidSchedulers.mainThread())把后续的回调切换到主线程,确保可以安全更新UI或执行主线程逻辑。 - 订阅回调:最后用lambda简化订阅逻辑,成功时把
ResponseTwo传给你的业务回调,错误时处理异常(空着onError会导致异常无法被捕获,很难排查问题)。
额外小提示
如果requestTwo需要依赖requestOne返回的某些数据,直接在flatMap里用response的数据传入即可,比如delegator.requestTwo(response.userId),这样就能实现依赖第一个请求结果的关联请求。另外,记得在页面销毁时Dispose掉订阅,避免内存泄漏——可以把订阅返回的Disposable存起来,在onDestroy里调用dispose()。
内容的提问来源于stack exchange,提问作者Jono
相关产品推荐
相关产品推荐

