这篇文章将围绕RxJava中的Subject来展开。
- Publish Subject
- Replay Subject
- Behavior Subject
- Async 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
网友评论