rxjava1源码笔记(一)

来源:互联网 发布:matlab gui 编程实例 编辑:程序博客网 时间:2024/06/07 01:21

rxjava大致流程

Observable.create(new Observable.OnSubscribe<String>() {    @Override    public void call(Subscriber<? super String> subscriber) {        subscriber.onNext("1");        subscriber.onCompleted();    }}).subscribe(new Subscriber<String>() {    @Override    public void onCompleted() {    }    @Override    public void onError(Throwable e) {    }    @Override    public void onNext(String s) {    }});

这是一个简单的rxjava调用。
当我们调用到subscribe方法的时候,程序最终会执行到这段

static <T> Subscription subscribe(Subscriber<? super T> subscriber, Observable<T> observable) {   ...   RxJavaHooks.onObservableStart(observable, observable.onSubscribe).call(subscriber);   return RxJavaHooks.onObservableReturn(subscriber);   ...}

这里对Observerable进行了一层封装,并最终将调用我们传入Observerable的onSubscribe对象的call方法,然后在onSubscribe对象的call方法中可以获得订阅的Subscriber对象,我们就在这里调用Subscriber的onNext方法。

rxjava中的map方法

public final <R> Observable<R> map(Func1<? super T, ? extends R> func) {    return unsafeCreate(new OnSubscribeMap<T, R>(this, func));}

可以看到map方法需要我们传入一个Func1的类,然后返回一个对应变换后的Observable。

首先来介绍一下Func这个接口。RxJava中有一系列Action+数字,Func+数字的接口,这些接口中都只有一个call方法,其中Action接口的call方法都没有返回值, Func接口的call方法都有返回值,后面的那个数字表示call方法接受几个泛型类型的参数。

这里map方法接收的参数类型为Func1

public final class OnSubscribeMap<T, R> implements OnSubscribe<R>public OnSubscribeMap(Observable<T> source, Func1<? super T, ? extends R> transformer) {    this.source = source;    this.transformer = transformer;}

观察到这个类OnSubscribe的泛型是map转化后的类,这保证了rxjava的方法调用可以以链条的形式进行。

我们再看OnSubscribeMap的call方法

public void call(final Subscriber<? super R> o) {    MapSubscriber<T, R> parent = new MapSubscriber<T, R>(o, transformer);    o.add(parent);    source.unsafeSubscribe(parent);}

在这个方法里重新创建了一个Subscriber对象,并且订阅了之前传入的Observable,也就是说对之前Observable直接进行处理的将会是新创建的Subscriber对象,这里可以猜测到在MapSubscriber里面将会对Observable传递过来的事件进行转化后再传递订阅了该OnSubscribeMap的Subscriber对象。观察OnSubscribeMap的onNext的实现果然如此。

public MapSubscriber(Subscriber<? super R> actual, Func1<? super T, ? extends R> mapper) {    this.actual = actual;    this.mapper = mapper;        }@Overridepublic void onNext(T t) {    R result;    try {        result = mapper.call(t);    } catch (Throwable ex) {        Exceptions.throwIfFatal(ex);        unsubscribe();        onError(OnErrorThrowable.addValueAsLastCause(ex, t));        return;    }    actual.onNext(result);}

可以看到在onNext里面通过之前传入的Func1类的call方法来对原始的事件进行加工,加工完后再传递给订阅的Subscriber对象,从而实现了事件的转化。

从上面可以看出,Observable的map方法实际上是新建了一个Observable来给下方的Subscriber订阅,并且在call方法中创建一个新的Subscriber来订阅上方的Observable,这个Subscriber收到事件再对事件进行一次加工后再通知下方的Subscriber接受加工之后的事件,从而实现一个事件的转化,并且依旧能保持函数链式调用。