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

RxJava Observer的timeout用法:超时触发后的处理逻辑应传入何处?

在RxJava中设置超时处理逻辑的正确位置

嘿,这个问题我太熟悉啦!在RxJava里使用timeout功能时,超时处理逻辑可不是直接硬塞给Subscriber的,得根据你选用的timeout操作符重载版本,把逻辑放在对应的参数位置里,下面给你拆解几种常见场景:

1. 基础场景:超时后触发错误回调

如果你只需要在超时后收到错误通知,那可以用最简单的timeout(long, TimeUnit)重载。这时超时会直接触发Subscriber的onError方法,抛出TimeoutException——你只需要在Subscriber的onError里判断异常类型,就能处理超时逻辑:

Observable.just("请求数据")
    .delay(15, TimeUnit.SECONDS) // 模拟耗时15秒的操作,超过设置的10秒超时
    .timeout(10, TimeUnit.SECONDS)
    .subscribe(new Subscriber<String>() {
        @Override
        public void onNext(String data) {
            // 正常接收数据的逻辑
        }

        @Override
        public void onCompleted() {
            // 任务正常完成的逻辑
        }

        @Override
        public void onError(Throwable e) {
            // 在这里处理超时!
            if (e instanceof TimeoutException) {
                // 你的超时处理代码:比如弹窗提示用户请求超时、发起重试等
                System.out.println("请求超时啦!");
            } else {
                // 处理其他类型的错误
            }
        }
    });

2. 进阶场景:超时后切换到备选Observable

要是你不想在超时后触发错误,而是想切换到另一个Observable(比如返回默认数据、自动重试请求),那就用timeout(long, TimeUnit, Observable)这个重载,把超时后的备选逻辑直接封装在第三个参数的Observable里:

Observable.just("请求数据")
    .delay(15, TimeUnit.SECONDS)
    .timeout(10, TimeUnit.SECONDS, Observable.just("超时默认数据"))
    .subscribe(new Subscriber<String>() {
        @Override
        public void onNext(String data) {
            // 这里可能收到原请求的数据,也可能收到超时后的默认数据
            if ("超时默认数据".equals(data)) {
                // 处理超时场景
                System.out.println("请求超时,使用默认数据");
            } else {
                // 正常处理请求结果
            }
        }

        // 其他回调方法...
    });

3. 自定义超时逻辑场景

如果需要更灵活的超时控制(比如给不同的事件设置不同的超时时间),可以用timeout(Func1, Func1)这类重载:第一个参数用来为每个事件生成对应的超时Observable,第二个参数是超时后的备选Observable——你的自定义超时逻辑就可以封装在这些Func1或者备选Observable里。

关键小提醒

千万不要自己在Subscriber的onNext里手动计算时间判断超时,这样既不优雅还容易出bug。RxJava的timeout操作符就是专门用来处理这类场景的,把超时逻辑和正常订阅逻辑分开,代码会清晰很多!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:15:02