Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can PublishSubject and BehaviorSubject be unsubscribed from?

Under the subjects package you have classes like PublishSubject and BehaviorSubject which I suppose can be described as some usable sample Observables.

How can these subjects be unsubscribed from? There is no unsubscribe method and calling onCompleted ends the Observable altogether right?

like image 326
arinte Avatar asked Jan 21 '14 12:01

arinte


People also ask

What is the difference between PublishSubject and BehaviorSubject?

PublishSubject : Starts empty and only emits new elements to subscribers. BehaviorSubject : Starts with an initial value and replays it or the latest element to new subscribers. ReplaySubject : Initialized with a buffer size and will maintain a buffer of elements up to that size and replay it to new subscribers.

What is BehaviorSubject Rxjava?

BehaviorSubject. BehaviorSubject emits the most recent item at the time of their subscription and all items after that. We will use the sample example we used for PublishSubject. Output Observer 1 onSubscribe. Observer 1 onNext: 0.


2 Answers

A Subject is an Observable and an Observer at the same time, it can be unsubscribed from just like normal observables. What makes subject special is that it is sort of bridge between observables and observers. It can pass through the items it observes by reemitting them, and it can also emit new items. Subjects are to observables as promises are to futures.

Here is a brief description of the subjects family:

AsyncSubject: only emits the last value of the source Observable

BehaviorSubject: emits the most recently emitted item and all the subsequent items of the source Observable when a observer subscribe to it.

PublishSubject: emits all the subsequent items of the source Observable at the time of the subscription.

ReplaySubject: emits all the items of the source Observable, regardless of when the subscriber subscribes.

the official doc comes with some nice marble diagrams which makes it more easier to understand

like image 169
Septem Avatar answered Oct 03 '22 04:10

Septem


Subjects are essentially are both Observables and Observers.

An Observable is essentially a thing that has a function that takes an Observer and returns a subscription. So, for example, given simple observable:

    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();         }     }); 

And here we would subscribe to it, to print out a line for each integer:

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

You would unsubscribe on the above by calling sub.unsubscribe().

Here is a PublishSubject that does roughly the same thing:

    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); 

You would unsubscribe from it the same way, by calling subscription.unsubscribe().

like image 35
martiansnoop Avatar answered Oct 03 '22 04:10

martiansnoop