一、基础
1、核心设计模式:观察者模式。Rxjava2分Observable和Flowable两种(无被压和有被压),A(Observer)观察B(Observable ),A是观察者,B是被观察者,被观察者B订阅观察者A
2、创建被观察者
Observable.create(new ObservableOnSubscribe<String>()
相当于
new ObservableCreate<>(new ObservableOnSubscribe<String>()
3、订阅 observable.subscribe(observer);
//具体的订阅实现方法,该方法为Observable类的抽象方法,具体实现在其子类
subscribeActual(observer)
如子类:ObservableCreate
@Override
protected void subscribeActual(Observer<? super T> observer) {
//事件发射器的创建类,相当于发射器的适配器
CreateEmitter<T> parent = new CreateEmitter<T>(observer);
//直接回调了观察者的onSubscribe
//onSubscribe()参数是Disposable ,所以CreateEmitter可以将Observer->Disposable 。
//还有一点要注意的是`onSubscribe()`是在我们执行`subscribe()`这句代码的那个线程回调的,
//并不受线程调度影响。
observer.onSubscribe(parent);
try {
// 调用了事件源subscribe方法生产事件,同时将发射器传给事件源。
// 现在我们明白了,数据源生产事件的subscribe方法只有在
// observable.subscribe(observer)被执行后才执行的。
// 换言之,事件流是在订阅后才产生的。
// 而observable被创建出来时并不生产事件,同时也不发射事件。
source.subscribe(parent);
} catch (Throwable ex) {
Exceptions.throwIfFatal(ex);
parent.onError(ex);
}
}
observer.onSubscribe(parent)作用是将该发射器类和观察者产生订阅关系,两者关联起来。source.subscribe(parent)中source就是在创建被观察者对象时传入的ObservableOnSubscribe对象实例,调用其subscribe方法,将上游事件发送对象(ObservableOnSubscribe)和下游接收对象(Observer)关联起来。
4、总结重点:
- Observable和Observer的关系没有被dispose,才会回调Observer的onXXXX()方法
- Observer的onComplete()和onError() 互斥只能执行一次,因为CreateEmitter在回调他们两中任意一个后,都会自动dispose()。根据第一点,验证此结论。
- Observable和Observer关联时(订阅时),Observable才会开始发送数据。
- ObservableCreate将ObservableOnSubscribe(真正的源)->Observable.
- ObservableOnSubscribe(真正的源)需要的是发射器ObservableEmitter.
- CreateEmitter将Observer->ObservableEmitter,同时它也是Disposable.
- 还有一点要注意的是
onSubscribe()
是在我们执行subscribe()
这句代码的那个线程回调的,并不受线程调度影响。
二、操作符和线程调度
1、操作符map,just,filter等有50个,大致逻辑基本都一样。
2、done在onError 和 onComplete以后才会是true,默认这里是false。
3、订阅的过程,是从下游到上游依次订阅的。
4、数据传递的过程,当然是从上游push到下游的。
5、subscribeOn()
只生效一次,observeOn()
会生效多次。
参考:
RxJava2 源码解析(一)https://blog.csdn.net/zxt0601/article/details/61614799
RxJava2 源码解析(二)https://blog.csdn.net/zxt0601/article/details/61637439