4種Subject 分別爲:PublishSubject、ReplaySubject、BehaviorSubject、AsyncSubject
Subject將觀察者和被觀察者結合爲一體,是觀察者和被觀察者的代理。
(1)AsyncSubject
AsyncSubject asyncSubject = AsyncSubject.create();
asyncSubject.onNext("A");
asyncSubject.onNext("B");
asyncSubject.subscribe(new Consumer<String>() {
@Override
public void accept(String s) throws Exception {
System.out.println("接收發射過來的數據:"+s);
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
}
}, new Action() {
@Override
public void run() throws Exception {
System.out.println("執行完成!");
}
});
asyncSubject.onNext("C");
asyncSubject.onComplete();
日誌如下:
也就是說,AsyncSubject 無論發射多少條數據,無論在訂閱前發射還是在訂閱後發射,都只會收到最後一條發射的數據。
(2)BehaviorSubject
BehaviorSubject behaviorSubject = BehaviorSubject.create();
behaviorSubject.onNext("A");
behaviorSubject.onNext("B");
behaviorSubject.subscribe(new Consumer<String>() {
@Override
public void accept(String s) throws Exception {
System.out.println("接收發射過來的數據:"+s);
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
}
}, new Action() {
@Override
public void run() throws Exception {
System.out.println("執行完成!");
}
});
behaviorSubject.onNext("C");
behaviorSubject.onComplete();
日誌如下:
也就是說,BehaviorSubjec只會接收到訂閱前最後一條發射的數據以及訂閱之後所有的數據。
(3)ReplaySubject
ReplaySubject replaySubject = ReplaySubject.create();
replaySubject.onNext("A");
replaySubject.onNext("B");
replaySubject.subscribe(new Consumer<String>() {
@Override
public void accept(String s) throws Exception {
System.out.println("接收發射過來的數據:"+s);
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
}
}, new Action() {
@Override
public void run() throws Exception {
System.out.println("執行完成!");
}
});
replaySubject.onNext("C");
replaySubject.onComplete();
日誌如下:
也就是說,ReplaySubject會接收到全部數據。
這裏需要補充一下:
ReplaySubject可以限制緩存的大小,也可以限制緩存的時間
ReplaySubject replaySubject = ReplaySubject.createWithSize(1);
ReplaySubject replaySubject = ReplaySubject.createWithTime(1000, TimeUnit.MILLISECONDS, Schedulers.newThread());
ReplaySubject replaySubject = ReplaySubject.createWithTimeAndSize(1000, TimeUnit.MILLISECONDS, Schedulers.newThread(), 1);
- createWithSize 限制可以接收訂閱前發射數據的條數;
- createWithTime 限制時間內可以接收訂閱前發射的數據;
- createWithTimeAndSize 限制時間內可以接收訂閱前發射數據的條數;
(4)PublishSubject
PublishSubject publishSubject = PublishSubject.create();
publishSubject.onNext("A");
publishSubject.onNext("B");
publishSubject.subscribe(new Consumer<String>() {
@Override
public void accept(String s) throws Exception {
System.out.println("接收發射過來的數據:"+s);
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
}
}, new Action() {
@Override
public void run() throws Exception {
System.out.println("執行完成!");
}
});
publishSubject.onNext("C");
publishSubject.onComplete();
日誌如下:
也就是說,PublishSubject只會接收到訂閱之後的所有數據。