本篇文章已受权微信公众号 YYGeeker
独家发布转载请标明出处java
CSDN学院课程地址bash
- RxJava2从入门到精通-初级篇:edu.csdn.net/course/deta…
- RxJava2从入门到精通-中级篇:edu.csdn.net/course/deta…
- RxJava2从入门到精通-进阶篇:edu.csdn.net/course/deta…
- RxJava2从入门到精通-源码分析篇:edu.csdn.net/course/deta…
Subject能够当作是一个桥梁或者代理,在RxJava中同时充当了Observer和Observable的角色,即事件流的发送方和接收方。由于它是一个Observer,它能够订阅一个或多个Observable;又由于它是一个Observable,它能够转发它收到(Observe)的数据,也能够发射新的数据。为了方便演示,在开始讲解Subject以前,咱们统一建立出SubjectObserver微信
static class SubjectObserver<T extends String> implements Observer<String> {
String name;
public SubjectObserver(String name) {
this.name = name;
}
@Override
public void onError(Throwable e) {
System.out.println("onError " + e.getStackTrace());
}
@Override
public void onComplete() {
System.out.println(name + " onComplete");
}
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(java.lang.String s) {
System.out.println(name + " onNext=" + s);
}
}
复制代码
PublishSubject不会改变事件的发送顺序。若是在已经发送了一部分事件以后注册的observer,是不会收到以前发送的事件async
public static void publishSubject() {
PublishSubject publishSubject = PublishSubject.create();
publishSubject.subscribe(new SubjectObserver<>("first"));
publishSubject.onNext("1");
publishSubject.onNext("2");
publishSubject.subscribe(new SubjectObserver<>("seconde"));
publishSubject.onNext("3");
publishSubject.onComplete();
}
复制代码
输出结果ide
first onNext=1
first onNext=2
first onNext=3
seconde onNext=3
first onComplete
seconde onComplete
复制代码
BehaviorSubject会建立出带有默认值的事件流。当BehaviorSubject第一次被observer注册时,若是observable中没有发射数据项的时候,就会将默认值发给observer;若是observable中有发射过数据项的时候,就会将最近发射的数据项发给observer源码分析
public static void behaviorSubject(View view) {
BehaviorSubject<String> behaviorSubject = BehaviorSubject.createDefault("默认值");
behaviorSubject.subscribe(new SubjectObserver<String>("first"));
behaviorSubject.onNext("1");
behaviorSubject.onNext("2");
behaviorSubject.subscribe(new SubjectObserver<String>("seconde"));
behaviorSubject.onNext("3");
behaviorSubject.onComplete();
}
复制代码
输出结果this
first onNext=默认值
first onNext=1
first onNext=2
seconde onNext=2
first onNext=3
seconde onNext=3
first onComplete
seconde onComplete
复制代码
ReplaySubject不管何时注册observer,不管什么时候经过ReplaySubject发射的全部事件,均会发送给新的observerspa
public static void replaySubject(View view) {
ReplaySubject<String> replaySubject = ReplaySubject.create();
replaySubject.subscribe(new SubjectObserver<>("first"));
replaySubject.onNext("1");
replaySubject.onNext("2");
replaySubject.subscribe(new SubjectObserver<>("seconde"));
replaySubject.onNext("3");
replaySubject.onComplete();
}
复制代码
输出结果.net
first onNext=1
first onNext=2
seconde onNext=1
seconde onNext=2
first onNext=3
seconde onNext=3
first onComplete
seconde onComplete
复制代码
只有当AsyncSubject调用onComplete方法时,才会将AsyncSubject中的最后一个事件传递给observer。若是不调用onComplete方法,则不会给observer发送任何事件代理
public static void asyncSubject(View view) {
AsyncSubject asyncSubject = AsyncSubject.create();
asyncSubject.subscribe(new SubjectObserver<String>("first"));
asyncSubject.onNext("1");
asyncSubject.onNext("2");
asyncSubject.onNext("3");
asyncSubject.onComplete();
asyncSubject.subscribe(new SubjectObserver<String>("seconde"));
asyncSubject.onComplete();
}
复制代码
输出结果
first onNext=3
first onComplete
seconde onNext=3
seconde onComplete
复制代码
每种Subject均可以看成是转发数据的桥梁,在转发数据的过程当中,具体使用哪一种应该参考对应的应用场景,一般在组件之间的通信就须要用到Subject。好比下面这个例子,从组件A中将信息传递给组件B,组件B会收到组件A发送过来的消息,若是须要组件B将信息传递给组件B,则须要将代码的观察者角色和被观察者角色调换过来。一般状况下,组件A和组件B都会同时依附于同一个Activity或Fragment,在Activity或Fragment中应该提供获取Subject的方法,让组件双方能够获取桥梁,从而互相subscribe,最终造成通信
public static void transpondData(View view){
//组件A
Observable<String> observable = Observable.fromArray("123","456","789");
ReplaySubject<String> replaySubject = ReplaySubject.create();
observable.subscribe(replaySubject);
replaySubject.subscribe(new SubjectObserver<>("B"));//组件B
}
复制代码
输出结果
B onNext=123
B onNext=456
B onNext=789
B onComplete
复制代码