AsyncSubject 它可以是被观察者 也可以是观察者 (ps: 雌雄同体)
public static void test4(){
// public abstract class Subject<T, R> extends Observable<R> implements Observer<T> 源码
AsyncSubject<String> observable = AsyncSubject.create();
observable.onNext("Hello gggg1");
observable.onNext("Hello gggg2");
observable.onNext("Hello gggg3");
observable.onCompleted();
Action1<String> stringAction1 = new Action1<String>() {
@Override
public void call(String s) {
Log.v(TAG,"...s.. = " + s);
}
};
observable.subscribe(stringAction1);
}
通过代码的实践可以发现: AsyncSubject在创建之后就可以发送事件,不必等到建立订阅关系.通过log打印发现 如果不调用onCompleted方法就接受不到任何事件,接受到的事件是onCompleted之前的一个事件(只能接受一个) 如果调用onError方法,因为观察者中没有处理会直接报错
BehaviorSubject 继承关系和上面的一样,我们还是通过log来观察它的变化
BehaviorSubject<String> observable = BehaviorSubject.create("default");
observable.onNext("Hello gggg1");
observable.onNext("Hello gggg2");
observable.onNext("Hello gggg3");
Action1<String> action1 = new Action1<String>() {
@Override
public void call(String s) {
Log.v(TAG,"...s.. = " + s);
}
};
observable.subscribe(action1);
可以看到log为订阅前的最后一条事件
BehaviorSubject<String> observable = BehaviorSubject.create("default");
observable.onNext("Hello gggg1");
observable.onNext("Hello gggg2");
observable.onNext("Hello gggg3");
Action1<String> action1 = new Action1<String>() {
@Override
public void call(String s) {
Log.v(TAG,"...s.. = " + s);
}
};
observable.subscribe(action1);
observable.onNext("Hello gggg1");
observable.onNext("Hello gggg2");
订阅后的全部事件都打印出来了
BehaviorSubject<String> observable = BehaviorSubject.create("default");
/*observable.onNext("Hello gggg1");
observable.onNext("Hello gggg2");
observable.onNext("Hello gggg3");*/
Action1<String> action1 = new Action1<String>() {
@Override
public void call(String s) {
Log.v(TAG,"...s.. = " + s);
}
};
observable.subscribe(action1);
observable.onNext("Hello gggg1");
observable.onNext("Hello gggg2");
如果订阅前没有事件发出,那么默认的则会执行
PublishSubject 创建和上面的一样,区别就是它只能接受订阅后的事件
ReplaySubject 创建和上面一样,它能接受所有的事件(订阅前后都能接收)
总结:Subject这四个子类在创建被观察者后就可以发送事件, 而普通的被观察者必须在产生订阅关系后才能发送事件
设置被观察者发送事件的时间
public static void test6(){
// 设置被观察者发送事件的时间
Observable<String> observable = Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
subscriber.onNext("Hello Android");
subscriber.onCompleted();
}
});
ConnectableObservable<String> publish = observable.publish(); //将普通被观察者转换为连接的被观察者
// ConnectableObservable<String> replay = observable.replay();
// Observable<String> observable1 = publish.refCount(); // 将可连接的被观察者转换为普通的被观察者
Observer<String> observer = new Observer<String>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(String s) {
Log.v(TAG,"...s.. = " + s);
}
};
publish.subscribe(observer);
publish.connect(); // 只有调用这个方法是 被观察者才会发送事件
}
重点: 如果普通的被观察者转换为可连接的被观察者时用的是publish方法,那么只有在connect方法之前的订阅可以接受到事件,connect方法之后的订阅是不能接收到事件的,如果想不分connect方法位置都能接受到事件,那么转换的时候请用replay方法