web-dev-qa-db-ja.com

PublishSubjectとBehaviorSubjectの購読を解除するにはどうすればよいですか?

subjectsパッケージの下には、PublishSubjectBehaviorSubjectのようなクラスがあります。これらは、使用可能なサンプルObservablesとして説明できると思います。

これらのサブジェクトはどのように登録解除できますか? unsubscribeメソッドはなく、onCompletedを呼び出すとObservableが完全に終了しますか?

36
arinte

サブジェクトはObservableObserverであり、通常のオブザーバブルと同様にサブスクライブ解除できます。サブジェクトを特別なものにしているのは、オブザーバブルとオブザーバーの橋渡しのようなものだということです。監視するアイテムを再送信することで通過でき、新しいアイテムも送信できます。対象は先物に対する約束と同様に、観測可能対象に対するものです。

以下は、サブジェクトファミリーの簡単な説明です。

AsyncSubject:ソースObservableの最後の値のみを出力します

BehaviorSubject:オブザーバーがサブスクライブすると、直近に放出されたアイテムとソースObservableのすべての後続のアイテムを放出します

PublishSubject:サブスクリプション時にソースObservableのすべての後続アイテムを発行します

ReplaySubject:サブスクライバーがサブスクライブする時期に関係なく、ソースObservableのすべてのアイテムを発行します。

公式ドキュメント には、わかりやすいニースの大理石図が付属しています

68
Septem

サブジェクトは基本的にboth Observables and Observersです。

Observableは基本的に、Observerを取得してサブスクリプションを返す関数を持つものです。したがって、たとえば、単純なオブザーバブルが与えられた場合:

_    Observable<Integer> observable = Observable.create(new Observable.OnSubscribeFunc<Integer>() {
        @Override
        public Subscription onSubscribe(Observer<? super Integer> observer) {
            observer.onNext(3);
            observer.onNext(2);
            observer.onNext(1);
            observer.onCompleted();

            return Subscriptions.empty();
        }
    });
_

そして、ここでサブスクライブして、各整数の行を出力します:

_    Subscription sub = observable.subscribe(new Action1<Integer>() {
        @Override
        public void call(Integer integer) {
            System.out.println(integer);
        }
    });
_

sub.unsubscribe()を呼び出して、上記の購読を解除します。

ほぼ同じことを行うPublishSubjectは次のとおりです。

_    PublishSubject<Integer> publishSubject = PublishSubject.create();
    Subscription subscription = publishSubject.subscribe(new Action1<Integer>() {
        @Override
        public void call(Integer integer) {
            System.out.println(integer);
        }
    });

    publishSubject.onNext(3);
    publishSubject.onNext(2);
    publishSubject.onNext(1);
_

subscription.unsubscribe()を呼び出すことにより、同じ方法でサブスクライブを解除します。

25
martiansnoop

すべてのSubjectsObservableを拡張し、複数のsubscribe(...)メソッドのいずれかを使用してサブスクライブできます。 subscribe(...)メソッドのいずれかを呼び出すと、Subscriptionが返されます。

_Subscription subscription = anySubject.subscribe(...);
_

Subjectからのイベントのリッスンを停止する場合は、このsubscriptionインスタンスのunsubscribe()メソッドを使用します。

_subscription.unsubscribe();
_
5
Praveer Gupta