RxJava之just源码解读

上一节我们主要讲了from的实现的原理,这讲我们主要分析的是just的源码
废话不多说,直接进入主题。

我们主要分析的是just的实现原理,subscribe的方法,我在这里不多解析,因为在前两章中,都对这个方法有详细的解释,如有不懂的,可以参见前一章,或是在底部留言,谢谢。

我们说过just方法,是对create的方法的一个封装,就像是create的简化版,首先我们上一张有关just的图:

这里写图片描述

这是一个最基本的just的方法的实现,当然subscribe中也可以传入Subscriber对象或是Action对象,这里对这两个不做过多的讲解,so easy。

看了这么一个最简单的实现,有没有感觉RxJava的链式调用超级好用呢?
代码看上去很整洁,调用也很简单,但是这并不是我们的最终的目的,我们最终的目的,是知道它实现的具体的原理。

再来看一张图:

这里写图片描述

1:和上次不同的是,当调用just的方法的时候,传入的是一个泛型数据,而from,传入的是Iterable类型的对象。
2:Returns an Observable that emits a single item and then completes.,这个是它的解释,意思是创建一个被观察者,它只是发送单一的一次数据,然后结束。
3:from,是发送多次数据,这和just有明显的不同。
4:create方法,也只是创建了一个ScalarSynchronousObservable,这个ScalarSynchronousObservable是继承自Observable的

从create点进去,我们可以看到:

这里写图片描述

它也是通过构造方法,创建了一个Obsevable对象。再后来是把我们 创建的list保存在了一个以t命名的变量当中。

接下来的subscribe方法的执行的分析过程,和上一张subscribe的原理一样,这里不多介绍,介绍的是当我们执行subscribe方法的时候,调用了这边的call方法,我们可以看到,这个是

public void call(Subscriber<? super T> s) {
                s.setProducer(createProducer(s, t));
            }
`
下面我们看下createProducer具体的逻辑是什么:

![这里写图片描述](https://img-blog.csdn.net/20161021043215758)``

我们看到,这里有一个Strong_Mode字段,这个字段可以通过这样设置:
![这里写图片描述](https://img-blog.csdn.net/20161021044209591)

当我们不设置的时候,这个值默认是false,也就是我们默认使用的是
WeakSingleProducer。那么可能有人会问,到底这两个producer有什么区别呢,不急不急,容我慢慢道来,

我们先来看下这两个类:

WeakSingleProducer implements Producer
SingleProducer extends AtomicBoolean implements Producer
“`
刚开始,我还以为是跟弱引用有关呢,哈哈,傻逼了,,,通过源码看到,两个producer,不同的一点是SingleProducer实现了AtomicBoolean,顾名思义,这个单词的意思是原子性,原子性的解释是:

原子是世界上的最小单位,具有不可分割性。比如 a=0;(a非long和double类型) 这个操作是不可分割的,那么我们说这个操作时原子操作。再比如:a++; 这个操作实际是a = a + 1;是可分割的,所以他不是一个原子操作。非原子操作都会存在线程安全问题,需要我们使用同步技术(sychronized)来让它变成一个原子操作。一个操作是原子操作,那么我们称它具有原子性。

再看下它的注解,也正是这个意思,WeakSingleProducer,它在多线程中执行是不安全的。

setProducer方法,就是去调用request方法:

这里写图片描述

这个request方法,就是调用subscribe中产生的observer2,然后observer2的onNext调用observer1的onNext,而它发射的时候,是发射我们一开始just传入的值,所以这里我们只会调用onNext方法一次,这也是just和from的区别之一。结束之后,调用onCompleted。

可能有人会问,just方法,有好几个重载的方法,那么当有多个参数传入的时候,他是怎么发送的呢?
有这种好奇心是好的,那么现在让我们来好好的分析一下把。

这里写图片描述

重这个图片中,我们看到,当我们在just中传入多个参数的时候,RxJava会把多个参数合并成一个数组,
这里写图片描述

我们看到当n=0的时候,只是设置了empty,因为没有数据,最后调用一下onComplete方法,当n=1的时候,就是我们上面分析的这种情况,我们这边重点看下n>1的时候,它会new一个OnSubscribeFromArray,这个也是继承自OnSubscribe,所以和我们以前的分析一样,
重点注意下下面这张图,

这里写图片描述

我们可以看到当传过来的是个数组的时候,我们会循环获取数组里面的每个元素遍历发送,直到结束,所以我们可以得到这样的结论,当just的方法中传入多个参数的时候,RxJava会把他们组装成一个数组,然后在发送的时候,循环获取里面的内容进行发送,会调用多次的onNext的方法。

至此,just的分析基本完成,如有疑问,清留言谢谢,下次解读的是map的源码,希望大家的光临,谢谢。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值