浅析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
- 浅析Rxjava(一)
- Rxjava源码浅析(一)观察者模式
- 浅析RXjava
- Rxjava浅析
- 浅析RxJava核心
- RxJava源码浅析
- Android使用RxJava浅析
- 浅析rxjava(二)lift
- RXJAVA方法调用浅析
- RxJava原理浅析
- Android rxjava用法浅析
- Android之RxJava(一)
- RxJava教程(一)
- Rxjava要素(一)
- RxJava 学习笔记一
- RxJAVA学习笔记(一)
- RxJava学习一:初识
- RxJava实例(一)
- JS内置对象
- 《中山大学内部选拔(一)》 游戏
- nginx for windows再编译版
- 排序算法:快速排序
- Android studio gradle 下载很缓慢的解决方法
- 浅析Rxjava(一)
- Jmeter中正则表达式提取器使用详解
- bzoj3298
- Jin Ge Jin Qu hao UVA
- 关于微信公众号回复消息乱码的问题
- 二叉树的镜像
- Session脏检查及清理缓存机制
- DeepMind背后的人工智能:深度学习原理初探
- CSDN日报20170314——《40岁程序员真的要被淘汰了么?》