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
相关产品推荐
相关产品推荐

