You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android RxJava:链式双请求及中间逻辑实现技术咨询

用RxJava flatMap实现网络请求链式调用的正确姿势

嘿,我来帮你梳理清楚这个链式请求的实现逻辑,顺便修正你现有代码里的几个小问题~

首先,你要的核心流程是先执行requestOne → 处理返回结果(保存Cookie)→ 执行requestTwo → 把requestTwo的结果传给onSuccess回调,用flatMap来串联这两个Single请求是完全正确的思路——它的作用就是把第一个请求的结果转换成第二个请求的Observable(这里是Single),让两个请求按顺序执行。

现有代码的几个小问题

  1. return delegator.requestTwo这里,如果你delegator.requestTwo是一个返回Single<ResponseTwo>的方法,那你需要调用它(也就是delegator.requestTwo()),而不是直接引用方法本身,不然返回的是方法对象而非Single实例,编译会报错。
  2. response.header(cookieStorage.COOKIE_HEADER_NAME)!!里的!!有潜在空指针风险,如果header不存在会直接崩溃,建议做非空安全处理。
  3. 匿名内部类的写法可以用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),方便排查问题 */ }
    )

整个流程的详细拆解

  1. 发起第一个请求:delegator.requestOne(requestData)返回Single<ResponseOne>,subscribeOn(Schedulers.io())指定这个请求在IO线程执行,避免阻塞主线程。
  2. flatMap串联第二个请求:当第一个请求成功返回ResponseOne后,进入flatMap的lambda:
    • 先检查response是否成功,若成功则用?.let安全获取Cookie头,存在的话就保存到cookieStorage。
    • 接着返回delegator.requestTwo(),RxJava会自动订阅这个新的Single,发起第二个网络请求。
  3. 线程切换与结果处理:observeOn(AndroidSchedulers.mainThread())把后续的回调切换到主线程,确保可以安全更新UI或执行主线程逻辑。
  4. 订阅回调:最后用lambda简化订阅逻辑,成功时把ResponseTwo传给你的业务回调,错误时处理异常(空着onError会导致异常无法被捕获,很难排查问题)。

额外小提示

如果requestTwo需要依赖requestOne返回的某些数据,直接在flatMap里用response的数据传入即可,比如delegator.requestTwo(response.userId),这样就能实现依赖第一个请求结果的关联请求。另外,记得在页面销毁时Dispose掉订阅,避免内存泄漏——可以把订阅返回的Disposable存起来,在onDestroy里调用dispose()。

内容的提问来源于stack exchange,提问作者Jono

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:18:35