Android-RxJavaAndroid-Rxjava&retrofit&daggerAndroid开发

理解RxJava Subject --Publish, Repl

2018-05-13  本文已影响76人  塞上牧羊空许约

这篇文章将围绕RxJava中的Subject来展开。

何谓Subject?

Subject是RxJava中实现既能扮演观察者(Observer)又能作为Observable的一种桥梁或者代理。因其为一个观察者,它可以订阅一个或多个Observable,又因其为一个Observable,他可以重新发射它观察到的值,也可以发射一些新的值。

我相信:通过例子来学习是最好的方法
Observable: 假定教授是一个Observable,教授讲解一些课题。
Observer: 假定学生是一个Observer,学生听教授正在讲解的课题。

Publish Subject

它发射源Observable被订阅之后的所有值。
如果一个学生上课迟到啦,他只想听到他进入教室后的内容。此时Publish是最适合这个场景。
来看看下面的例子:

PublishSubject<Integer> source = PublishSubject.create();

//  1, 2, 3, 4 and onComplete
source.subscribe(getFirstObserver()); 

source.onNext(1);
source.onNext(2);
source.onNext(3);

// It will get 4 and onComplete for second observer also.
source.subscribe(getSecondObserver());

source.onNext(4);
source.onComplete();

Replay Subject

他发射源Observable的所有值,无论订阅者何时订阅。

如果一个学生迟到啦,他想从头听起。此时我们可以使用Replay来实现。
例子如下:

ReplaySubject<Integer> source = ReplaySubject.create();
// It will get 1, 2, 3, 4
source.subscribe(getFirstObserver()); 
source.onNext(1);
source.onNext(2);
source.onNext(3);
source.onNext(4);
source.onComplete();
// It will also get 1, 2, 3, 4 as we have used replay Subject
source.subscribe(getSecondObserver());

Behavior Subject

当观察者订阅时,它发射源Observable最近一次以及后续的所有值。
比如,一个学生迟到啦,他想听老师最近讲解的内容(不是从头开始),以了解上下文。所以此时我们会使用Behavior
代码如下:

BehaviorSubject<Integer> source = BehaviorSubject.create();
// It will get 1, 2, 3, 4 and onComplete
source.subscribe(getFirstObserver());
source.onNext(1);
source.onNext(2);
source.onNext(3);
// It will get 3(last emitted)and 4(subsequent item) and onComplete
source.subscribe(getSecondObserver());
source.onNext(4);
source.onComplete();

Async Subject

它值发射源Observable的最后一个值,之后Observable便结束啦。
如果一个学生在任何一个时刻进入教室,而且他只想他听到教授讲解的最后一个内容,之后变下课啦。此时我们会使用Async.
代码如下:

AsyncSubject<Integer> source = AsyncSubject.create();
// It will get only 4 and onComplete
source.subscribe(getFirstObserver());
source.onNext(1);
source.onNext(2);
source.onNext(3);
// It will also get only get 4 and onComplete
source.subscribe(getSecondObserver());
source.onNext(4);
source.onComplete();

翻译自:Understanding RxJava Subject — Publish, Replay, Behavior and Async Subject

上一篇下一篇

猜你喜欢

热点阅读