ReplaySubject会发射所有来自原始Observable的数据给观察者,无论它们是何时订阅的。也 有其它版本的ReplaySubject,在重放缓存增长到一定大小的时候或过了一段时间后会丢弃旧 的数据(原始Observable发射的)。
如果你把ReplaySubject当作一个观察者使用,注意不要从多个线程中调用它的onNext方法 (包括其它的on系列方法),这可能导致同时(非顺序)调用,这会违反Observable协议, 给Subject的结果增加了不确定性。
demo
ReplaySubject<Integer> subject = ReplaySubject.create();
System.out.println("******1*******");
subject.onNext(1);
System.out.println("******2*******");
subject.subscribe(new Action1<Integer>() {
@Override
public void call(Integer integer) {
System.out.println("-----" + integer);
}
}, new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
System.out.println("onError");
}
}, new Action0() {
@Override
public void call() {
System.out.println("onComplete");
}
});
System.out.println("******3*******");
subject.onNext(2);
System.out.println("******4*******");
subject.onNext(3);
System.out.println("******5*******");
subject.subscribe(new Action1<Integer>() {
@Override
public void call(Integer integer) {
System.out.println("Subscriber2:" + integer);
}
});
System.out.println("******6*******");
subject.onNext(4);
System.out.println("******7*******");
subject.onCompleted();
输出
******1*******
******2*******
-----1
******3*******
-----2
******4*******
-----3
******5*******
Subscriber2:1
Subscriber2:2
Subscriber2:3
******6*******
-----4
Subscriber2:4
******7*******
onComplete