web-dev-qa-db-ja.com

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

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

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に言及しただけですObservableから発行されたコンシューマーアイテムに対して、ほとんどの時間サブスクライバーを使用します。

誰か説明してもらえますか

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

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

78
MarcusH

[〜#〜] edited [〜#〜]:@Alridのコメント付き

tl; dr

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

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

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

長い話

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

このページに興味があります(2番目の章です): KeyTypes

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

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

...

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

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

このbookが言っていないこと... RxJava実装で

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

  • 通知-> Observer
  • (un)subscription-> Subscription

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

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

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


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

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

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

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

  2. SubscriberObserverであり、そのデータソースからもサブスクライブ解除できます(Subscriptionインターフェイス経由)。

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

36

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

Observableとの主な違いは、新しいSubscriberがバックプレッシャーをサポートしていることです。

ObserverObservableにサブスクライブされ、SubscriberFlowableにサブスクライブされます(org.reactivestreams.Publisher)。

詳細な説明を参照してください here

18

また、RxJava2で、サブスクライブ解除できるようにするには、ResourceObserverObservableを、ResourceSubscriberFlowableを使用する必要があります。

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

3
Beshoy Fayez