观察者和订阅者有什么区别?

我试图破译以下function:

Subscription getCar(id, Observer<Car> observer) { return getCarDetails(id, new Observer<CarDetails> { @Override onNext(CarDetails details) { observer.onNext(details.getCar()); } }); } 

我从http://blog.danlew.net/2014/09/15/grokking-rxjava-part-1/获得了一个很好的rxjava入门介绍,但是它只是在提到Observer时说过,你将会使用Subscriber的大部分时间消费者从Observable发射的物品。

有人可以向我解释

  1. 什么是观察员?
  2. 观察者与订阅者有什么不同?
  3. 上面的代码片断是做什么的?

Javadoc使它看起来就像一个用户。 用户的javadoc表示它实现观察者和订阅。 我很困扰。

编辑 :与@ Alrid的评论

TL;博士

 public abstract class Subscriber<T> implements Observer<T>, Subscription 

所以订阅者是观察者的一个实现,在订阅上有更多的语义(更多关于未订阅)。 你问题中的代码只是表明它通过Observer接口,而不是实现(通常的编程习惯)。

此代码也返回一个Subscription ,这可能是因为这个代码的作者认为客户端应该只能访问Subscription方法,而无需访问由observable产生的元素。 这可能是程序员错误。

很长的故事

真的,你应该阅读本网站(或书)的内容: http : //www.introtorx.com这是关于Rx.Net,但概念是相同的,他们是由Erik Meijer和RxJava实现者创build的如果适用于Java语言)。

这个页面会让你感兴趣(这是第二章): KeyTypes

在这里你可以阅读第一段:

使用Rx时需要了解两个关键types,以及辅助types的一个子集,可以帮助您更有效地学习Rx。 IObserver和IObservable构成了Rx的基本构build模块,而ISubject的实现减less了Rx开发者的学习曲线。

本质上,Rxbuild立在观察者模式的基础之上。 .NET已经公开了一些其他方法来实现观察者模式,例如多播委托或事件(通常是多播委托)。

即使types/ API有些不同,你也可以从这本书中学到很多东西,而不是一些博客。

本书不说…因为它在RxJava实现中

此时RxJava的主要开发人员引入了一些细微的变化(见PR #792 ),可以区分两种types的合同:

  • 通知 – > Observer
  • (联合国)订阅 – > Subscription

这种改变可以更好地expression/分解RxJava库实现类的这些问题。

但作为一个库用户,使用RxJava库的实际实现应该足够好。

实现一个订户需要更多的知识,工作和关心,事实上订阅语义是非常重要的,这取决于源可观察的types(热或冷?创build昂贵?)


在上述情况下公开Subscriber而不是Observer在大多数情况下不会干扰代码,但除非需要这些未订阅语义,否则不是它的预期用途。 但最终实现一个Subscriber ,可能会涉及到一些陷阱,如:

  1. 花费资源的function,你不会使用
  2. 不能从另一个类inheritance
  3. 写不正确的订阅代码
  4. 复制/粘贴代码为不同的上下文编写不正确的代码或正确的代码

(编辑:这显然只适用于RxJava 1)。

  1. Observer是一个可以从数据源( Observable )获取数据的对象。 数据源通过调用观察者的onNext()将数据推送给它。

  2. Subscriber是一个Observer ,也可以取消订阅该数据源(通过Subscription界面)。

  3. getCar()函数试图返回汽车,但没有直接的方法来做到这一点。 但有一个函数来获取汽车的详细信息( getCarDetails() ),这将调用观察所有的汽车细节。 所以它调用这个函数并传递给一个观察者,当它获得数据的时候,会从细节中获取汽车数据并传递给它自己的观察者。

在RxJava 2中 org.reactivestreams.Subscriber是一个org.reactivestreams.Subscriber Reactive Streams规范的接口。

Observable的主要区别是新的Subsciber支持背压。

Observer被subcibed为ObservableSubscriber被订阅到org.reactivestreams.Publisher (实现org.reactivestreams.Publisher )。

在这里看到详细的描述

同样在RxJava2中 ,如果您想要取消订阅,则应该使用ResourceObserver for ObservableResourceSubscriber for Flowable

检查这个问题