subjects
パッケージの下には、PublishSubject
やBehaviorSubject
のようなクラスがあります。これらは、使用可能なサンプルObservables
として説明できると思います。
これらのサブジェクトはどのように登録解除できますか? unsubscribe
メソッドはなく、onCompleted
を呼び出すとObservableが完全に終了しますか?
サブジェクトはObservable
とObserver
であり、通常のオブザーバブルと同様にサブスクライブ解除できます。サブジェクトを特別なものにしているのは、オブザーバブルとオブザーバーの橋渡しのようなものだということです。監視するアイテムを再送信することで通過でき、新しいアイテムも送信できます。対象は先物に対する約束と同様に、観測可能対象に対するものです。
以下は、サブジェクトファミリーの簡単な説明です。
AsyncSubject:ソースObservableの最後の値のみを出力します
BehaviorSubject:オブザーバーがサブスクライブすると、直近に放出されたアイテムとソースObservableのすべての後続のアイテムを放出します
PublishSubject:サブスクリプション時にソースObservableのすべての後続アイテムを発行します
ReplaySubject:サブスクライバーがサブスクライブする時期に関係なく、ソースObservableのすべてのアイテムを発行します。
公式ドキュメント には、わかりやすいニースの大理石図が付属しています
サブジェクトは基本的に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()
を呼び出すことにより、同じ方法でサブスクライブを解除します。
すべてのSubjects
はObservable
を拡張し、複数のsubscribe(...)
メソッドのいずれかを使用してサブスクライブできます。 subscribe(...)
メソッドのいずれかを呼び出すと、Subscription
が返されます。
_Subscription subscription = anySubject.subscribe(...);
_
Subjectからのイベントのリッスンを停止する場合は、このsubscription
インスタンスのunsubscribe()
メソッドを使用します。
_subscription.unsubscribe();
_