浅析Rxjava(一)

来源:互联网 发布:滨州大数据产业园 编辑:程序博客网 时间:2024/05/19 06:37

使用的库是
compile 'io.reactivex:rxjava:1.0.14'compile 'io.reactivex:rxandroid:1.0.1'
不同的版本,可能源码不一样


1.先来看看要解析的例子

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


很简单的例子,就是打印字符串1111。我们来看create方法。
    public final static <T> Observable<T> create(Observable.OnSubscribe<T> f) {        return new Observable<T>(hook.onCreate(f));    }    protected Observable(Observable.OnSubscribe<T> f) {        this.onSubscribe = f;    }
这个hook.onCreate(f)方法,里面就直接把f返回回来,可以查看源码这里就不粘出来了。所以Observable.create其实就是把OnSubscribe对象实例存储到Observable里面的onSubscribe。

接下来我们来看subscribe()方法。
 public final Subscription subscribe(final Observer<? super T> observer) {        if (observer instanceof Subscriber) {            return subscribe((Subscriber<? super T>)observer);        }        return subscribe(new Subscriber<T>() {            @Override            public void onCompleted() {                observer.onCompleted();            }            @Override            public void onError(Throwable e) {                observer.onError(e);            }            @Override            public void onNext(T t) {                observer.onNext(t);            }        });    }
我们发现会把observer对象转换成Subscriber对象,然后我们来看subscribe()方法。

    public final Subscription subscribe(Subscriber<? super T> subscriber) {        return Observable.subscribe(subscriber, this);    }    private static <T> Subscription subscribe(Subscriber<? super T> subscriber, Observable<T> observable) {        subscriber.onStart();        try {            hook.onSubscribeStart(observable, observable.onSubscribe).call(subscriber);            return hook.onSubscribeReturn(subscriber);        } catch (Throwable e) {            Exceptions.throwIfFatal(e);            try {                subscriber.onError(hook.onSubscribeError(e));            } catch (OnErrorNotImplementedException e2) {                throw e2;            } catch (Throwable e2) {                RuntimeException r = new RuntimeException("Error occurred attempting to subscribe [" + e.getMessage() + "] and then again while trying to pass to onError.", e2);                hook.onSubscribeError(r);                throw r;            }            return Subscriptions.unsubscribed();        }    }
中间删掉了一些代码,我们看核心代码。开始会执行subscriber.onStart()方法,就是在subscribe方法中新new Subscriber的。

下面的逻辑可能有点绕。
然后hook.onSubscribeStart(observable, observable.onSubscribe).call(subscriber)这个方法中的hook.onSubscribeStart(observable, observable.onSubscribe)这个方法里,就直接把observable.onSubscribe返回回来,也就是说,这个方法其实就是observable.onSubscribe.call(subscriber),这个onSubscribe是在create()的时候传递进来的,那这个方法就走到上面例子的subscriber.onNext("1111"),而这个subscriber实例,就是刚刚在subscribe()方法里new subscribe()出来的,然后执行到observer.onNext(t)这里,这里的observer实例是在例子中subscribe(new Observer<String>()),这个new observer<String>()的,然后就到Log.v("next", s)这里了,整个流程就完了,log日志就打出来了。
可能会有点绕,可以用debug模式,在关键处打断点,一个一个观察。




1 0
原创粉丝点击