RxJava 源码解读分析 观察者模式

RxJava 源码解读分析 系列

RxJava 文档中文档 github地址 点击打开

RxJava 源码解读分析  观察者模式

RxJava源码解读分析  Scheduler

RxJava 源码解读分析 subscribeOn 方法

RxJava 源码解读分析 observeOn

RxJava 源码解读分析 from

RxJava 源码解读分析 just

RxJava 源码解读分析 defer

RxJava 源码解读分析 map

RxJava 源码解读分析 flatMap

=============== 分隔线 ===============

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,后续步骤就一样了。

猜你喜欢

转载自blog.csdn.net/collonn/article/details/70809123
今日推荐