前言
Rxjava2 我们都知道是很牛逼的一个扩展的观察者模式的Scheduler,基本可以在代码中替代异步线程+Handler的开发模式,同时配合MVP设计模式,可以更好的实现业务分离。但是并不能盲目崇拜,不能为了使用而使用,一切以编码需求为主。最近开始研读源码,也边读边写下自己的一些理解把。
Rxjava最基础的模式分析
Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(ObservableEmitter<String> e) throws Exception {
e.onNext("ssss");
e.onComplete();
}
}).subscribe(new Observer<String>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(String value) {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
这是一个不具备操作符,以及没有线程调度的一个例子。
我们点进create
方法中查看源码
这里我们抛弃其他的干扰,只需要知道它将一层层封装,最后返回了Observable
对象实例。
然后我们查看subscribe
方法。
这里暂时只有subscribeActual(observer)
这行对我们有效,我们接着点进去。发现是一个接口,随后我们找到实现他方法的地方。
这里我们发现通过ObservableCreate
类中的subscribeActual
方法,将观察者和被观察者关联起来了。这里我们先不急的查看CreateEmitter
类,我们先看source.subscribe(parent)
方法。
ObservableEmitter
接口也是实现一些基本方法,我们暂时只需要关注onNext,onError,onCompete
。
我们再回到ObservableCreate
类中的subscribeAtal
方法发现它将Observe
封装成了CreateEitter
。
代码看到这,我们就可以尝试理清下业务逻辑,相比传统的观察者模式的观察者以及被观察者,这里还多了个订阅者,以及事件。同时通过这个简单例子给我们的信息是只有通过订阅才会执行事件。 我们可以梳理下执行流程:
先通过Observable.create
方法将ObservableOnSubscribe
实例传入,封装成一个ObservableCreate
,最后再封装成Observable
对象进行返回。执行subscribe
时,将Observer
封装成CreateEmitter
,并传入ObservableOnSubscribe
执行onSubscribe
中的事件,最后把结果通过CreateEmitter
回调出来。
我们先写个观察者接口实现基本方法
仿写最基础模式加深理解
先写个观察者接口
public interface Observer<T> {
public void onNext(T t);
public void onError(Exception e);
public void onComplete();
}
然后我们发现源码中,有个ObservableEmitter
接口作为事件结果回调,我们同时也弄过来,我们暂时只考虑最基本的方法。
public interface ObservableEmitter<T> {
public void onNext(T t);
public void onError(Exception e);
public void onComplete();
}
其次是事件接口
public interface ObservableOnSubscribe<T> {
public void subscribe(ObservableEmitter<T> observableEmitter);
}
随后我们看ObservableOnSubscribe
接口,源码中只含有subscribe(ObservableEmitter<T> e)
一个方法
然后写个被观察者
public class Observable<T> {
private ObservableOnSubscribe observableOnSubscribe;
private Observable(ObservableOnSubscribe observableOnSubscribe){
this.observableOnSubscribe = observableOnSubscribe;
}
public static Observable create(ObservableOnSubscribe observableOnSubscribe){
return new Observable(observableOnSubscribe);
}
}
create
使用静态方法,将传入的ObservableOnSubscribe
转换成Observable
对象。
然后我们实现一个CreateEmitter
类
public class CreateEmitter<T> implements ObservableEmitter<T> {
private Observer<T> observer;
public CreateEmitter(Observer<T> observer){
this.observer = observer;
}
@Override
public void onNext(T t) {
observer.onNext(t);
}
@Override
public void onError(Exception e) {
observer.onError(e);
}
@Override
public void onComplete() {
observer.onComplete();
}
}
最后我们回到Observable
类添加订阅方法
public class Observable<T> {
...
public void subscribe(Observer<? super T> observice){
observableOnSubscribe.subscribe(new CreateEmitter(observice));
}
}
这样就结束了,一个极其精简版以及不具备线程调度,操作符的小扩展观察者模式就实现了。调用也同rxjava一样。
Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(ObservableEmitter<String> observableEmitter) {
observableEmitter.onNext("s");
observableEmitter.onComplete();
}
}).subscribe(new Observer<String>() {
@Override
public void onNext(String s) {
System.out.println("-------hhhhh-- "+s);
}
@Override
public void onError(Exception e) {
}
@Override
public void onComplete() {
}
});
这步分析仅仅是阅读rxjava的第一步,也是基础和最简单的一步。
Diposed是什么
我们在源码CreateEmitter
中回调结果的时候会发现有个!isDisposed()
的条件判断,这个diposed是什么,字面理解是处理,其实他处理的是订阅消息。我们都知道事件方法中ObservableEmitter
的父类Emitter
拥有onNext,onError,onComplete
,onError
与onComplete
是互斥关系,执行了两者方法之一,都不会再次回调结果给观察者的onNext,onError,onComplete
方法。
Disposable
只是一个接口,只实现了两个方法。
再看ObservableEmitter
,继承了AtomicReference<Disposable>
,我们进入AtomicReference
发现V value
通过传入的Disposable
泛型,value就是Disposable
的一个实例,实例化中并没有看到赋值,所以我们可以认为他默认为null
。我们再继续看ObservableEmitter
的回调结果传递发现onComplete,onError
执行完一定会执行dispose()
方法-DisposableHelper.dispose(this);
,this
是ObservableEmitter
自身实例对象。进入DisposableHelper
类发现是个枚举类,且大部分方法都是静态方法。
这个是ObservableEmitter
是在回调结果传递时会判断的。前面我们说了,通常情况下初始化ObservableEmitter
的实例对象,它的Disposable
的value
==null。
这里是我们执行完onComplete,onError
后会掉用的静态方法,将枚举结果复制给传递进来的ObservableEmitter
实例对象,中断订阅者以及被观察者的关系。这个值的设立是用在运算符中的判断上,例如两个Observable
串行,当第一个如果出错执行了一次onError
,后续就会中断订阅关系。
这是我第一次描述源码解析的感想,可能会有些理解错误以及表达不清楚的地方,希望多多包涵,rxjava这个框架十分复杂,我也还正在研读,希望能学会更多里面所用到的思想,有空我还会续写第二偏。