首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >观察者和订阅者之间的区别是什么?

观察者和订阅者之间的区别是什么?
EN

Stack Overflow用户
提问于 2014-12-27 12:03:21
回答 4查看 35.6K关注 0票数 91

我正在尝试破译以下函数:

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的一个很好的介绍,但它只顺便提到了观察者,说你将在大部分时间里使用订阅者来消费从可观察对象发出的项。

有人能给我解释一下吗?

  1. 什么是观察者?
  2. 观察者与观察者有什么不同?上面的代码片段有什么不同?

Javadoc让它看起来就像一个订阅者。订阅者的javadoc说它实现了观察者和订阅。我很困惑。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-12-27 20:35:09

编辑了:带有@Alrid的评论

tl;dr

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

因此,SubscriberObserver的一个实现,在订阅上有额外的语义(它更多的是关于取消订阅)。您问题中的代码只是显示它传递的是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),允许区分两种类型的合同:

  • notification Observer
  • (un)subscription Subscription

-> ->

这一变化允许更好地表达/拆分RxJava库的实现类的这些问题。

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

实现订阅者需要更多的知识、工作和关注,实际上,订阅语义非常重要,这取决于可观察到的源的类型(热的还是冷的?创建成本很高?)

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

  1. 将资源用于您不会使用的功能
  2. 无法从其他类继承
  3. 编写不正确的取消订阅

代码不正确的代码或为不同上下文编写的正确代码

票数 72
EN

Stack Overflow用户

发布于 2015-10-06 13:20:52

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

  1. An Observer是一个可以从数据源( Observable)获取数据的对象。数据源通过调用观察者的onNext().
  2. A将数据推送到该数据源。Subscriber是一个也可以取消订阅该数据源的Observer (通过Subscription Subscription getCar()函数尝试返回汽车,但没有直接的方法可以做到这一点)。但是有一个获取汽车详细信息的函数(getCarDetails()),它将调用一个观察者,其中包含所有汽车详细信息。因此,它调用该函数并将其传递给一个观察者,当它获得数据时,将从详细信息中获取汽车数据,并将其传递给自己的观察者。
票数 43
EN

Stack Overflow用户

发布于 2017-01-13 20:29:57

RxJava 2 org.reactivestreams.Subscriber中的是一个符合Reactive Streams specification的接口。

Observable的主要区别在于,新的Subscriber支持背压。

Observer订阅ObservableSubscriber订阅Flowable (实现org.reactivestreams.Publisher)。

请参阅详细说明here

票数 23
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27664221

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档