观察者和订阅者有什么区别?
我试图破译以下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发射的物品。
有人可以向我解释
- 什么是观察员?
- 观察者与订阅者有什么不同?
- 上面的代码片断是做什么的?
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
,可能会涉及到一些陷阱,如:
- 花费资源的function,你不会使用
- 不能从另一个类inheritance
- 写不正确的订阅代码
- 复制/粘贴代码为不同的上下文编写不正确的代码或正确的代码
(编辑:这显然只适用于RxJava 1)。
-
Observer
是一个可以从数据源(Observable
)获取数据的对象。 数据源通过调用观察者的onNext()
将数据推送给它。 -
Subscriber
是一个Observer
,也可以取消订阅该数据源(通过Subscription
界面)。 -
getCar()
函数试图返回汽车,但没有直接的方法来做到这一点。 但有一个函数来获取汽车的详细信息(getCarDetails()
),这将调用观察所有的汽车细节。 所以它调用这个函数并传递给一个观察者,当它获得数据的时候,会从细节中获取汽车数据并传递给它自己的观察者。
在RxJava 2中 org.reactivestreams.Subscriber
是一个org.reactivestreams.Subscriber
Reactive Streams规范的接口。
从Observable
的主要区别是新的Subsciber
支持背压。
Observer
被subcibed为Observable
, Subscriber
被订阅到org.reactivestreams.Publisher
(实现org.reactivestreams.Publisher
)。
在这里看到详细的描述
同样在RxJava2中 ,如果您想要取消订阅,则应该使用ResourceObserver
for Observable
和ResourceSubscriber
for Flowable
。
检查这个问题