前言
本文是关于 RxJava 中可用的主题的全部内容。
- 发布主题
- 重播主题
- 行为主体
- 异步主题
让我们了解一下主题。
什么是主题?
Subject 是一种桥接器或代理,在 ReactiveX 的某些实现中可用,它既充当观察者又充当 Observable。因为它是一个观察者,它可以订阅一个或多个Observable,并且因为它是一个Observable,它可以通过重新发射它观察到的项目来传递它们,它也可以发射新的项目。
我相信:以身作则是最好的学习方式
发布主题
它在订阅时发出源 Observable 的所有后续项。
在这里,如果一个学生进入教室很晚,他只想从他进入教室的那个时间点开始听。因此,Publish将是这个用例的最佳选择。
请参见以下示例:
PublishSubject<Integer> source = PublishSubject.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 4 and onComplete for second observer also.
source.subscribe(getSecondObserver());
source.onNext(4);
source.onComplete();
重播主题
无论订阅者何时订阅,它都会发出源 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());
行为主体
当观察者订阅它时,它会发出最近发出的项目和源 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();
异步主题
只有在源 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();
因此,每当您遇到这些类型的情况时,RxJava 主题将是您最好的朋友。