RxJava 源码解读分析 系列
=============== 分隔线 ===============
RxJava不太好理解,可以说很费解,我们先来梳理一下,整体上的一些概念。
我找不到能比HeadFirst设计模式系列更好的,更有说服力的,插图,推荐大家也可看一看。
先在最上层的设计模式这个层次上来看看观察者模式,如下图。
其次,再从jdk这个稍微具体一点的层次,来看看观察者模式,如下图。
细心的读者也许会发现,在观察者模式中,Subject和Observable是同一个概念,我们称Observable是"可观察者",也就是我们观察(监视)的对象,或者叫“主题”,都是可以的。
而Observable“可观察者”中的register observer, or add observer, remove observer对应的就是RxJava中的subscribe和unsubscribe,好理解吧。
Observer直接翻译为“观察者”,Subscriber直接翻译为“订阅者”,是一个意思,都是对Subject(主题)感兴趣的人,RxJava也是同样的概念,Subscriber类实现了Observer接口。
好了,我们再来看看RxJava中的几个基础类的类关系图,如下图。
别着急,我们一步一步的来说。
怎么产生Observable,从图中可以看出来,Observable可以通过自身产生,具体代码如下:
Observable observable = Observable.create(new Observable.OnSubscribe<Integer>() {
@Override
public void call(Subscriber<? super Integer> subscriber) {
log.debug("aaa");
subscriber.onNext(1);
subscriber.onNext(2);
subscriber.onCompleted();
}
});
从类图中,我们还可以看出Observable中组合了一个OnSubscribe对象。这个东西是什么,怎么理解呢?
接口OnSubscribe继承于接口Action1,只定义了一个call()方法,这个方法只有一个参数,无返回值。以此类推到接口ActionN
以javascripte为例:
OnClick意思是,当点了这个按钮时,去执行动作1。
OnMouseMove意思是,当鼠标移动时,去执行动作2。
OnSubscribe自然理解为,当subscribe时,执行subscriber.call(subscriber)方法。
事实上,RxJava就是这么干的,精简代码如下:
static <T> Subscription subscribe(Subscriber<? super T> subscriber, Observable<T> observable) {
...
RxJavaHooks.onObservableStart(observable, observable.onSubscribe).call(subscriber);
return RxJavaHooks.onObservableReturn(subscriber);
...
}
好,我们来总结一下:
Observable是通过执行subscribe()方法与Subscriber确定了关联关系。
在调用subscribe()方法的同时,会执行OnSubscribe.call(subscriber)方法(即Action1.call(T)方法),而call(subscriber)的参数正是Subscriber对象。
当我们定义的OnSubscribe.call()主体方法完成后,会调用一次或多次subscriber.onNext()方法,最多一次subscriber.onError()或subscriber.onComplete()方法。
Observable.subscribe()方法有多个重写版本,基本都一样,只是通过ActionSubscribert和ObserverSubscriber转化为了Subscriber,后续步骤就一样了。