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

RxJava结合Retrofit的四种subscribe订阅方式差异解析

Retrofit结合RxJava中subscribe四种实现的区别解析

嘿,这四种subscribe的实现可不是功能一致的,它们对应RxJava不同版本的API设计和不同的业务场景需求,我给你逐个拆解清楚:

1. 基于Subscriber的实现(过时写法)

Observable<PostMessage> call = service.callAPI(data); 
call.subscribeOn(Schedulers.io()) 
.observeOn(AndroidSchedulers.mainThread()) 
.subscribe(new Subscriber<PostMessage>( )); 

这是RxJava 1.x时代的经典写法,在RxJava 2.x及以后的版本里已经被标记为**过时(@Deprecated)**了。Subscriber是Observer的抽象实现,它默认帮你处理了订阅时的资源管理,但RxJava 2.x重构了资源管理逻辑(引入了Disposable),所以官方已经不推荐使用这种写法了,新项目里尽量避免。

2. 基于Consumer的极简实现

Observable<PostMessage> call = service.callAPI(data); 
call.subscribeOn(Schedulers.io()) 
.observeOn(AndroidSchedulers.mainThread()) 
.subscribe(new Consumer<PostMessage>( ) { 
    @Override 
    public void accept(PostMessage postMessage) throws Exception { } 
}); 

这是最简化的订阅写法,只关注正常事件流的处理(也就是onNext回调)。如果你只关心API请求成功后拿到数据做业务处理,完全不需要处理错误、事件完成或者订阅回调,这种写法会很省事。

但要注意风险:如果Observable发送了onError事件(比如API请求失败),这里没有对应的错误处理逻辑,会直接抛出OnErrorNotImplementedException,大概率导致APP崩溃。所以这种写法只适合你能确保不会出现错误的场景,或者已经在上游用onErrorReturn、onErrorResumeNext这类操作符提前处理了错误的情况。

3. 基于DisposableObserver的简化完整实现

Observable<PostMessage> call = service.callAPI(data); 
call.subscribeOn(Schedulers.io()) 
.observeOn(AndroidSchedulers.mainThread()) 
.subscribe(new DisposableObserver<PostMessage>() { 
    @Override 
    public void onNext(PostMessage postMessage) { } 
    @Override 
    public void onError(Throwable e) { } 
    @Override 
    public void onComplete() { } 
}); 

这是RxJava 2.x专门为优化资源管理推出的Observer替代实现,是旧Subscriber的官方替代品。它内部已经帮你持有了Disposable对象,你可以通过它的dispose()方法手动取消订阅,避免内存泄漏。

它要求你实现三个核心方法:onNext(处理成功返回的数据)、onError(处理请求错误)、onComplete(事件流正常结束时回调),省去了onSubscribe的手动实现,兼顾了完整性和简洁性,是日常开发中最推荐的写法之一。

4. 基于Observer的全量自定义实现

Observable<PostMessage> call = service.callAPI(data); 
call.subscribeOn(Schedulers.io()) 
.observeOn(AndroidSchedulers.mainThread()) 
.subscribe(new Observer<PostMessage>( ) { 
    @Override 
    public void onSubscribe(Disposable d) { } 
    @Override 
    public void onNext(PostMessage postMessage) { } 
    @Override 
    public void onError(Throwable e) { } 
    @Override 
    public void onComplete() { } 
}); 

这是最灵活、最完整的观察者实现,要求你实现所有四个回调方法:

  • onSubscribe:订阅成功时触发,在这里你可以拿到Disposable对象,手动保存到CompositeDisposable里统一管理,或者立即取消订阅(比如页面已经销毁时)
  • onNext:处理正常返回的数据
  • onError:处理请求错误
  • onComplete:事件流正常结束时触发

这种写法适合需要精细控制订阅生命周期的场景,比如在页面销毁时统一取消所有订阅,或者在订阅时做一些初始化逻辑。


总结一下:

  • 第一种是旧API的遗留写法,已过时,不推荐使用
  • 第二种是极简写法,只处理成功事件,风险较高,需谨慎使用
  • 第三种是平衡了简洁性和完整性的推荐写法,适合大多数日常场景
  • 第四种是全量自定义写法,灵活度最高,适合需要精细控制的场景

内容的提问来源于stack exchange,提问作者R.Roshan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:26:19