前言
不知不觉都已经写到第四篇了,虽然写的不是很好,但是最重要的用途还是自己记录下,能够提高自己最重要。
从本篇开始,代码的分析将会趋于简单化,因为有了上面三篇的基础,基本已经了解了Observable中的设计方式,无非就是Observable一层层封装,Observer也是一层层封装通过链式实现链式。
Observable.Create
今天突然发现最基本的Create方法忘记了,赶紧拿起来看下。
public staticObservable create(ObservableOnSubscribe source) { ObjectHelper.requireNonNull(source, "source is null"); return RxJavaPlugins.onAssembly(new ObservableCreate (source)); }
该方法传入的参数是一个ObservableOnSubscribe类型的参数。和rxjava1中的参数不同了,但是效果还是一样的,就是相当于让你自己发送数据。
返回了一个ObservableCreate,直接看一下
@Override protected void subscribeActual(Observer observer) { CreateEmitterparent = new CreateEmitter (observer); observer.onSubscribe(parent); try { source.subscribe(parent); } catch (Throwable ex) { Exceptions.throwIfFatal(ex); parent.onError(ex); } }
代码很直观,套路也一样,讲observer观察者封装一层,CreateEmitter,然后直接调用observer的onSubscribe方法,传入一个Disposable,和其他一样,这里的CreateEmitter不仅承载了观察者的作用,还承载了Disposable的作用。
然后调用source(也就是我们Create时传入的参数)的subscribe方法,意思差不多是“请开始你的表演!”
该方法的参数是ObservableEmitter类型,拥有onNext系列,以及对于Disposable控制的抽象方法等待实现,当然这里就是CreateEmitter了,来看下。
我们回去调用 CreateEmitter的onNext发送数据,而他实际上就是调用被封装了的observer观察者的onNext方法……完全合理,没啥技术含量嘛……
Lift
曾经不知道在哪篇博客上看到,所有的操作符实际上都是基于lift
public finalObservable lift(ObservableOperator lifter) { ObjectHelper.requireNonNull(lifter, "onLift is null"); return RxJavaPlugins.onAssembly(new ObservableLift (this, lifter)); }
基础代码还是一样简答,创建了一个ObservableLift对象,并且直接返回。
@Override public void subscribeActual(Observer s) { Observer observer; try { observer = ObjectHelper.requireNonNull(operator.apply(s), "Operator " + operator + " returned a null Observer"); } .... source.subscribe(observer); }
这段代码也比较容易,其中operator就是我们调用lift时传入的参数。通过apply方法,将subscribe注册的观察者进行封装,然后注册到源被观察者上。
以前一直以为lift是操作被观察者,将它发送的数据转换成我们需要的类型。但是实际情况可能是相反的,逻辑大概如下:
首先我有一个返回String类型的observable ,但是我需要注册一个接收Int类型的观察者。于是我们调用lift方法,将int类型的观察者转换成string类型的观察者,注册到这个observable中。
那么数据应该如何适配呢?这个就取决于用户在apply中的实现方案了,比如可以这样:
public Observer apply(@NonNull final Observer observer) throws Exception { return new Observer() { @Override public void onSubscribe(Disposable d) { observer.onSubscribe(d); } @Override public void onNext(String s) { observer.onNext(Integer.parseInt(s)); } @Override public void onError(Throwable e) { observer.onError(e); } @Override public void onComplete() { observer.onComplete(); } }; }
我们输入一个observer<integer>,封装一下,输出了一个observer<string> 。
以上就是lift所做的所有事情,框架帮我们的做得很少,所以我们觉得使用lift的难度比较大,但是掌握它的根本原理和实际意义,那么实际上,它是最肤浅的操作符了!
Map
map操作的实现,简单来说就是封装,然后在onNext或者poll中对数据进行类型转化后返回。