RxJave源码解析(一)
来源:互联网 发布:淘宝隐形降权查询网站 编辑:程序博客网 时间:2024/05/16 05:45
这个当成只是当成一个临时笔记,可能会些错误
一、先看一个常见的流程。
Observable<String> observable1 = Observable.just("aa");observable1.subscribe(new Subscriber<String>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(String s) { System.out.println(s); } });
拆分
1、创建:Observable observable = Observable.just(“aa”);
看源码可知是创建了一个Observable的子类ScalarSynchronousObservable
protected ScalarSynchronousObservable(final T t) { super(hook.onCreate(new JustOnSubscribe<T>(t))); this.t = t; }
这里为了让分析更简单点,我们就把ScalarSynchronousObservable忽略掉,直接当成Observable来看代(大致说下ScalarSynchronousObservable的作用用来处理只有一个Subscriber的Observable)。
这里是调用了父类Observable的构造方法
protected Observable(OnSubscribe<T> f) { this.onSubscribe = f; }
OnSubscribe类只有一个它父类Action1的抽象方法
public interface Action1<T> extends Action { void call(T t);}
继续看源码发现给Observable的构造函数传入的是一个JustOnSubscribe对象
static final class JustOnSubscribe<T> implements OnSubscribe<T> { final T value; //value是要处理的对象,即我们上文传的字符串"aa" JustOnSubscribe(T value) { this.value = value; } @Override public void call(Subscriber<? super T> s) { s.setProducer(createProducer(s, value)); } }
重点看下call方法。这里是给事件的通知者设置一个制造者,
createProducer(s, value)最终是创造了一个WeakSingleProducer对象
public WeakSingleProducer(Subscriber<? super T> actual, T value) { //事件的通知者 this.actual = actual; //要处理的对象 this.value = value; }
到这里,整个创建过程也到了尾声。
我们现在看看对象之间的关系是啥样
Observable{ onSubscribe = JustOnSubscribe{ value = "aa" @Override public void call(Subscriber<? super T> s) { s.setProducer(createProducer(s, value)); } }}
2、subscribe过程、贴核心代码
static <T> Subscription subscribe(Subscriber<? super T> subscriber, Observable<T> observable) { //调用事件通知者的onStart()方法 subscriber.onStart(); //subscriber不属于SafeSubscriber就将subscriber重新指向一个新的SafeSubscriber if (!(subscriber instanceof SafeSubscriber)) { subscriber = new SafeSubscriber<T>(subscriber); } try { //这里与observable.onSubscribe).call(subscriber)等价 //在上文提到的对象之间的关系中可以看出是调用了JustOnSubscribe.call(Subscriber<? super T> s)方法。 //上面分析过call方法的作用了,这里也就是给subscriber对象中设置了WeakSingleProducer对象。然后调用了本身的setProducer方法。 hook.onSubscribeStart(observable, observable.onSubscribe).call(subscriber); return hook.onSubscribeReturn(subscriber); } catch (Throwable e) { subscriber.onError(hook.onSubscribeError(e)); } return Subscriptions.unsubscribed(); } }
看下Subscriber.setProducer(Producer p) 方法
//如果上层还有订阅者,则走上层订阅者的setProducer,一直递归到最上层,再一层的一层的调用producer.request方法 public void setProducer(Producer p) { long toRequest; boolean passToSubscriber = false; synchronized (this) { toRequest = requested; producer = p; if (subscriber != null) { if (toRequest == NOT_SET) { passToSubscriber = true; } } } if (passToSubscriber) { subscriber.setProducer(producer); } else { if (toRequest == NOT_SET) { producer.request(Long.MAX_VALUE); } else { producer.request(toRequest); } } }
从上面我们知道了这个producer,就是WeakSingleProducer类。直接看下他的request(long n)方法。
@Override public void request(long n) { if (once) { return; } if (n < 0L) { throw new IllegalStateException("n >= required but it was " + n); } if (n == 0L) { return; } once = true; Subscriber<? super T> a = actual; if (a.isUnsubscribed()) { return; } T v = value; try { a.onNext(v); } catch (Throwable e) { Exceptions.throwOrReport(e, a, v); return; } if (a.isUnsubscribed()) { return; } a.onCompleted(); }
可以看出经过一系统的判断,最后执行了OnNext()、onCompleted()方法。
看到这,我们再回想一下整个执行过程。
observable1 = Observable{ onSubscribe= JustOnSubscribe{ "aa" }}subscriber1 = Subscriber{ subscriber = null subscriptions = SubscriptionList;}-->observable1.subscribe(safeSubscriber1{ subscriber = subscriber1})observable1.onSubscribe.call(safeSubscriber1)-->subscriber1.setProducer(weakSingleProducer1(safeSubscriber1,"aa"))-->safeSubscriber1.subscriber1.setProducer(weakSingleProducer1)safeSubscriber1.subscriber1.producer.request()safeSubscriber1.subscriber1.producer.actual.onNextsafeSubscriber1.subscriber1.producer.actual.onCompleted-->over
添加一个filter,再观察下流程是什么样的
Observable<String> observable1 = Observable.just("aa"); Observable<String> observable2 = observable1.filter(new Func1<String, Boolean>() { @Override public Boolean call(String s) { return true; } }); Subscriber<String> subscriber = new Subscriber<String>() { //xxx }; observable2.subscribe(subscriber); observable1 = Observable{ onSubscribe= JustOnSubscribe{ "aa" }}像上面一样跟踪一下过程observable1 = Observable{ onSubscribe= JustOnSubscribe{ "aa" }}-->observable2 = Observable{ onSubscribe=OnSubscribeLift{ parent=observable1.onSubscribe operator = OperatorFilter{ predicate = 上面的匿名内部类Func1 } }}-->subscriber = Subscriber{ subscriber = null subscriptions = SubscriptionList;} observable2.subscribe(subscriber); subscriber.onStart()subscriber = SafeSubscriber{ subscriber = subscriber}observable2.OnSubscribeLift.call(subscriber)-->observable2.OnSubscribeLift.operator.call(subscriber)==observable2.OnSubscribeLift.OperatorFilter.call(SafeSubscriber)-->SafeSubscriber.subscriptions.add{FilterSubscriber(SafeSubscriber,上面的匿名内部类Func1)}FilterSubscriber.start()observable1.onSubscribe.call(FilterSubscriber)==JustOnSubscribe.call(FilterSubscriber)FilterSubscriber.setProducer(createProducer(s, value));FilterSubscriber.actual(SafeSubscriber).setProducer
0 0
- RxJave源码解析(一)
- Irrlicht源码解析(一)
- tomcat源码解析(一)
- HDFS源码解析(一)
- OKHttp源码解析(一)
- OKHttp源码解析(一)
- SDWebImage源码解析(一)
- Connect 源码解析(一)
- OKHttp源码解析(一)
- Volley 源码解析(一)
- AFNetworking源码解析(一)
- OKHttp源码解析(一)
- Volley源码解析(一)
- WebViewJavaScriptBridge源码解析(一)
- Spark源码解析(一)
- Retrofit2源码解析(一)
- AFNetworking源码解析(一)
- Retrofit2源码解析(一)
- JAVA面向对象基础
- git clone error: The requested URL returned error: 403 Forbidden while accessing.
- quartz 数据库表含义解释
- VS2008—LINK error: cannot open file 'LIBC.lib'
- Spring 中 DirectFieldAccessor 类的使用
- RxJave源码解析(一)
- KOOCAN美食课堂—中国潮州不止只有牛肉丸,还有这个!
- android ---SQLite
- Android studio 插件
- Qt Charts示例
- 使用shell脚本 启动关闭tomcat服务
- JZOJ4876. 【NOIP2016提高A组集训第10场11.8】时空传送 拓扑序判断最长路是否合法
- 关于设置elasticsearch 的cluster.name 和 node.name
- C++每日一练(STL算法——remove)