浅析Rxjava(一)

使用的库是
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模式,在关键处打断点,一个一个观察。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值