深入理解RxJava编程思想( 六 )


这时候new 的时候,将soure = 自定义,所以最终得出结论:
new ObservableCreate() {souce = 自定义source}
再分析订阅过程,源码分析:
public final void subscribe(Observer observer) {ObjectHelper.requireNonNull(observer, "observer is null");try {observer = RxJavaPlugins.onSubscribe(this, observer);ObjectHelper.requireNonNull(observer, "The RxJavaPlugins.onSubscribe hook returned a null Observer. Please change the handler provided to RxJavaPlugins.setOnObservableSubscribe for invalid null returns. Further reading: https://github.com/ReactiveX/RxJava/wiki/Plugins");subscribeActual(observer);}
传进去一个,我们称之为自定义观察者,最终会把自定义观察者丢进中,而是一个抽象函数,实现这个抽象函数的一定是在中,因为是通过点出来的,我们再进入中看,这个函数把我们的自定义观察者包装成一个发射器
protected void subscribeActual(Observer observer) {CreateEmitter parent = new CreateEmitter(observer);observer.onSubscribe(parent);try {source.subscribe(parent);} catch (Throwable ex) {Exceptions.throwIfFatal(ex);parent.onError(ex);}}
这时候我们用图片来展示流程:
我们不难发现,整体是一个U型流程
与订阅的过程时序图如下:
标准的观察者设计模式与观察者设计模式区别
从直观角度分析
在标准的观察者设计模式中:是一个“被观察者”,多个“观察者”,并且需要“被观察者”发出改变通知时,所有的“观察者”才能观察到 。
在观察者设计模式中:是多个“被观察者”,一个“观察者”,并且需要起点和终点在”订阅“一次后,才发出改变通知,终点(观察者)才能观察到 。
从模式角度分析
在标准的观察者设计模式中:当发出通知改变时,会遍历里面的容器,此容器里面有10个,就会通知10个
在观察者设计模式中:分发事件时,会拿到发射器,通过发射器关联到我们自定义的,发射器调用到我们自定义的
Map变换操作符原理
map示意图:
通过源码分析总结的流程图:
其实Map实现变换的本质就是不断进行封包裹和拆包裹,说白就是一个洋葱模型,具体实现变换的代码在类中的()函数中,通过.apply(t)将类型变换
static final class MapObserver extends BasicFuseableObserver {.....@Overridepublic void onNext(T t) {.....try {v = ObjectHelper.requireNonNull(mapper.apply(t), "The mapper function returned a null value.");} catch (Throwable ex) {fail(ex);return;}downstream.onNext(v);}public interface Function {/*** Apply some calculation to the input value and return some other value.* @param t the input value* @return the output value* @throws Exception on error*/R apply(@NonNull T t) throws Exception;}
装饰模型
线程切换原理
给上面代码分配线程
首先分析.io()这个流程:
从源码看到,第一步过程很简单,就是将实例对象扔进线程池 。
再分析()过程:
这时候我们发现在这个流程中,所有执行都在异步线程中,回到终点岂不是崩溃??所以应该在终点切换为主线程,那么继续看下一个线程切换:
给下面的代码切换主线程
首先分析.()的流程:
第一步流程就是创建了主线程的,把传进去 。
接下来看() 的流程: