我正在尝试破译以下函数:
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的一个很好的介绍,但它只顺便提到了观察者,说你将在大部分时间里使用订阅者来消费从可观察对象发出的项。
有人能给我解释一下吗?
Javadoc让它看起来就像一个订阅者。订阅者的javadoc说它实现了观察者和订阅。我很困惑。
发布于 2014-12-27 20:35:09
编辑了:带有@Alrid的评论
tl;dr
public abstract class Subscriber<T> implements Observer<T>, Subscription
因此,Subscriber是Observer的一个实现,在订阅上有额外的语义(它更多的是关于取消订阅)。您问题中的代码只是显示它传递的是Observer
接口,而不是实现(通常的编程实践)。
此外,这段代码返回一个Subscription
,这可能是因为这段代码的作者认为客户端应该只能访问Subscription
方法,而不能访问由observable生成的元素。这可能是程序员的错误。
long story
你真的应该读一下这个网站(或书)的内容:http://www.introtorx.com它是关于Rx.Net的,但概念是完全相同的,它们是由Erik Meijer创建的,RxJava实现者遵循them (如果适用于Java语言)。
你会对这个页面感兴趣(这是第二章):KeyTypes
这里你将在第一段中读到:
使用Rx时,有两个关键类型需要了解,以及辅助类型的子集,它们将帮助您更有效地学习Rx。IObserver和IObservable构成了Rx的基本构建块,而ISubject的实现降低了Rx新手的学习曲线。
..。
本质上讲,Rx是建立在观察者模式的基础上的。.NET已经公开了一些实现观察者模式的其他方法,例如多播委托或事件(通常是多播委托)。
即使类型/ API稍有不同,你也会从这本书中学到很多,可能比一些博客学到的要多得多。
What this book do not (...because it is in RxJava implementation)
RxJava main developer此时引入了一个细微的变化(参见PR #792),允许区分两种类型的合同:
Observer
Subscription
-> ->
这一变化允许更好地表达/拆分RxJava库的实现类的这些问题。
但是,作为一个库用户,使用RxJava库的实际实现应该足够好了。
实现订阅者需要更多的知识、工作和关注,实际上,订阅语义非常重要,这取决于可观察到的源的类型(热的还是冷的?创建成本很高?)
在上述情况下,公开Subscriber
而不是Observer
在大多数情况下不会干扰中的代码,但除非需要那些取消订阅语义,否则这不是它的预期用途。但最终实现一个Subscriber
,可能会涉及到一些陷阱,例如:
代码不正确的代码或为不同上下文编写的正确代码
发布于 2015-10-06 13:20:52
(编辑:这显然只适用于RxJava 1。)
Observer
是一个可以从数据源( Observable
)获取数据的对象。数据源通过调用观察者的onNext()
.Subscriber
是一个也可以取消订阅该数据源的Observer
(通过Subscription
Subscription
getCar()
函数尝试返回汽车,但没有直接的方法可以做到这一点)。但是有一个获取汽车详细信息的函数(getCarDetails()
),它将调用一个观察者,其中包含所有汽车详细信息。因此,它调用该函数并将其传递给一个观察者,当它获得数据时,将从详细信息中获取汽车数据,并将其传递给自己的观察者。发布于 2017-01-13 20:29:57
RxJava 2 org.reactivestreams.Subscriber
中的是一个符合Reactive Streams specification的接口。
与Observable
的主要区别在于,新的Subscriber
支持背压。
Observer
订阅Observable
,Subscriber
订阅Flowable
(实现org.reactivestreams.Publisher
)。
请参阅详细说明here。
https://stackoverflow.com/questions/27664221
复制相似问题