オブザーバーとサブスクライバーの違いは何ですか?


83

私は次の関数を解読しようとしています:

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の良い紹介を得ましたが、オブザーバーについてのみ言及されており、ほとんどの場合サブスクライバーを使用すると述べています。 Observableから放出される消費財までの時間。

誰かが私に説明できますか

  1. オブザーバーとは何ですか?
  2. オブザーバーはサブスクライバーとどう違うのですか?
  3. 上記のコードスニペットは何をしますか?

Javadocは、それをサブスクライバーのように見せました。サブスクライバーのjavadocは、オブザーバーとサブスクリプションを実装すると述べています。私は非常に混乱しています。


これは、オブザーバーパターンとパブリッシュ/サブスクライブです。それらは似ていますが、微妙な違いがあります。
ショーンパトリックフロイド

4
@SeanPatrickFloyd:違いを説明できますか?
user541686 2014

'details'変数とは何ですか?
マリアンPaździoch

回答:


63

EDITED:Alridさんのコメント@付き

tl; dr

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

したがって、サブスクライバーオブザーバーの実装であり、サブスクリプションに追加のセマンティクスがあります(サブスクリプション解除に関するものです)。質問のコードObserverは、実装(通常のプログラミング手法)ではなく、インターフェイスを通過することを示しています。

また、このコードはを返します。これは、このコードの作成Subscription者が、クライアントはSubscriptionメソッドにのみアクセスでき、observableによって生成された要素にはアクセスできないと考えたためである可能性があります。それはプログラマーのエラーかもしれません。

長い話

本当にこのウェブサイト(または本)の内容を読む必要があります:http//www.introtorx.com Rx.Netについてですが、概念はまったく同じで、Erik Meijerによって作成され、RxJavaの実装者がそれに続きました( Java言語に該当する場合)。

このページはあなたの興味を引くでしょう(それは第2章です):KeyTypes

ここでは、最初の段落で読みます:

Rxを使用するときに理解する2つの主要なタイプと、Rxをより効果的に学習するのに役立つ補助タイプのサブセットがあります。IObserverとIObservableは、Rxの基本的な構成要素を形成しますが、ISubjectの実装は、Rxを初めて使用する開発者の学習曲線を短縮します。

..。

基本的に、RxはObserverパターンの基盤の上に構築されています。.NETは、マルチキャストデリゲートやイベント(通常はマルチキャストデリゲート)など、オブザーバーパターンを実装する他のいくつかの方法をすでに公開しています。

タイプ/ APIが少し異なっていても、この本で多くのことを学ぶことができます。おそらく、いくつかのブログよりもはるかに多くのことを学ぶことができます。

このが言っていないこと... RxJava実装にあるため

この時点でRxJavaのメイン開発者は、2つのタイプのコントラクトを区別できるようにするわずかなバリエーション(PR #792を参照)を導入しました。

  • 通知-> Observer
  • (非)サブスクリプション-> Subscription

この変更により、RxJavaライブラリの実装クラスに関するこれらの懸念をより適切に表現/分割することができました。

ただし、ライブラリユーザーとしては、RxJavaライブラリの実際の実装を使用するだけで十分です。

サブスクライバーの実装には、はるかに多くの知識、作業、および注意が必要です。実際、サブスクリプションのセマンティクスは、監視可能なソースのタイプ(ホットまたはコールド?作成に費用がかかる?)に応じて非常に重要です。


上記のような場合Subscriberではなく公開Observerしても、ほとんどの場合コードに干渉しませんが、サブスクリプション解除のセマンティクスが必要でない限り、コードの使用目的ではありません。しかし、最終的にはSubscriber、を実装し、次のようないくつかの落とし穴に陥る可能性があります。

  1. 使用しない機能にリソースを費やす
  2. 別のクラスから継承することはできません
  3. 間違ったサブスクリプション解除コードを書く
  4. 間違ったコードまたは別のコンテキスト用に記述された正しいコードをコピーして貼り付ける

1
2.xでは、ObserverはObservableのサブスクライブに使用され、SubscriberはFlowableの
ReactiveX /

39

(編集:これは明らかにRxJava 1にのみ当てはまります。)

  1. AnObserverは、データソース(an Observable)からデータを取得できるオブジェクトです。データソースは、オブザーバーのを呼び出すことによってデータをプッシュしますonNext()

  2. ASubscriberは、Observerそのデータソースから(Subscriptionインターフェイスを介して)サブスクライブを解除することもできます。

  3. このgetCar()関数は車を返そうとしていますが、それを直接行う方法はありません。しかしgetCarDetails()、すべての車の詳細でオブザーバーを呼び出す車の詳細()を取得する関数があります。そのため、その関数を呼び出してオブザーバーを渡します。オブザーバーは、データを取得すると、詳細から車のデータをフェッチして、独自のオブザーバーに渡します。


2
これは、RxJava 2の時点では当てはまりません。サブスクライバーとオブザーバーは、2つの完全に異なるインターフェースです。どちらももう一方を拡張しません
FRR 2017

19

RxJava 2 org.reactivestreams.Subscriberでは、ReactiveStreams仕様に準拠したインターフェースです。

との主な違いObservableは、newSubscriberが背圧をサポートすることです。

ObserverにサブスクライブされObservableSubscriberサブスクライブされますFlowable(実装org.reactivestreams.Publisher)。

詳細な説明はこちらをご覧ください。


3

また、RxJava2では、購読を解除できるようにする場合は、ResourceObserverforObservableおよびResourceSubscriberforを使用する必要がありますFlowable

この質問を確認してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.