私は次の機能を解読しようとしています:
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から発行されたコンシューマーアイテムに対して、ほとんどの時間サブスクライバーを使用します。
誰か説明してもらえますか
Javadoc サブスクライバーのように見えました。サブスクライバのjavadocには、オブザーバとサブスクリプションを実装すると書かれています。私は非常に混乱しています。
[〜#〜] edited [〜#〜]:@Alridのコメント付き
tl; dr
public abstract class Subscriber<T> implements Observer<T>, Subscription
したがって、 Subscriber は Observer の実装であり、サブスクリプションに追加のセマンティクスがあります(サブスクリプション解除の詳細です)。質問のコードは、実装ではなく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
Subscription
この変更により、RxJavaライブラリの実装クラスに関するこれらの懸念をより明確に表現/分割することができました。
ただし、ライブラリユーザーとしては、RxJavaライブラリの実際の実装を使用するだけで十分です。
サブスクライバーを実装するには、はるかに多くの知識、作業、および注意が必要です。実際、サブスクリプションのセマンティクスは、観測可能なソースの種類に応じて非常に重要です(ホットまたはコールド?作成するのに費用がかかりますか?)
上記のような場合にSubscriber
ではなくObserver
を公開しても、ほとんどの場合コードに干渉しませんが、これらのサブスクリプション解除のセマンティクスが必要でない限り、コードの使用は意図されていません。しかし、最終的にはSubscriber
を実装し、次のような落とし穴に陥る可能性があります。
(編集:これは明らかにRxJava 1にのみ当てはまります。)
Observer
は、データソースからデータを取得できるオブジェクトです(Observable
)。データソースは、オブザーバーのonNext()
を呼び出してデータをプッシュします。
Subscriber
はObserver
であり、そのデータソースからもサブスクライブ解除できます(Subscription
インターフェイス経由)。
getCar()
関数は車を返そうとしていますが、それを行う直接的な方法はありません。ただし、車の詳細を取得する関数(getCarDetails()
)があり、すべての車の詳細でオブザーバーを呼び出します。そのため、この関数を呼び出してオブザーバーに渡します。オブザーバーはデータを取得すると、詳細から車のデータを取得し、独自のオブザーバーに渡します。
RxJava 2ではorg.reactivestreams.Subscriber
は、 Reactive Streams仕様 に準拠したインターフェースです。
Observable
との主な違いは、新しいSubscriber
がバックプレッシャーをサポートしていることです。
Observer
はObservable
にサブスクライブされ、Subscriber
はFlowable
にサブスクライブされます(org.reactivestreams.Publisher
)。
詳細な説明を参照してください here 。
また、RxJava2で、サブスクライブ解除できるようにするには、ResourceObserver
にObservable
を、ResourceSubscriber
にFlowable
を使用する必要があります。
これを確認してください 質問