RxJava源码分析之subscribeOn和observeOn_subscribeon observeon-程序员宅基地

技术标签: RxJava  subscribeOn  RxJava探析  Observable  ObserveOn  

RxJava源码分析之subscribeOn和observeOn

RxJava的特色就是可以改变他的任务线程,可以很优雅的在子线程和主线程中切换,而切换用到的两个主要方法是subscribeOn()和observeOn().

备注:因本人水平有限,以下分析只代表本人所见,如有不当,请见谅并指出。

subscribeOn()和observeOn()的区别

  • subscribeOn()主要改变的是订阅的线程。即call()执行的线程
  • ObserveOn()主要改变的是发送的线程。即onNext()执行的线程。

subscribeOn()分析

在分析之前,首先要明确一点,不然会产生思路混乱。

当我们调用了Observable.subscribe()方法,发生了什么????

总结性的说:创建Subscriber对象,调用OnSubscribe对象的call方法。注意,Subscriber什么都没做,Subscriber什么都没做,Subscriber什么都没做。重要的事情说三遍,下面开始分析。

首先,我们写一个例子:

 Observable
                .create(new Observable.OnSubscribe<String>() {
                    @Override
                    public void call(Subscriber<? super String> subscriber) {
                        subscriber.onNext("a");
                        subscriber.onNext("b");

                        subscriber.onCompleted();
                    }
                })
                .subscribeOn(Schedulers.io())

                .subscribe(new Observer<String>() {
                    @Override
                    public void onCompleted() {

                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onNext(String integer) {
                        System.out.println(integer);
                    }
                });

这个例子很简单,但在intellij 中运行,不打印任何东西,但在ecplise中确没问题。打印如下:

a
b

这个问题我也搞不清为什么,如果有知道的欢迎留言。

老套路,我们看一下subscribeOn()中,都干了什么

  public final Observable<T> subscribeOn(Scheduler scheduler) {
        if (this instanceof ScalarSynchronousObservable) {
            return ((ScalarSynchronousObservable<T>)this).scalarScheduleOn(scheduler);
        }
        return create(new OperatorSubscribeOn<T>(this, scheduler));
    }

很明显,会走if之外的方法。

在这里我们可以看到,我们又创建了一个Observable对象,但创建时传入的参数为OperatorSubscribeOn(this,scheduler),我们看一下此对象以及其对应的构造方法

public final class OperatorSubscribeOn<T> implements OnSubscribe<T> {

    final Scheduler scheduler;
    final Observable<T> source;

    public OperatorSubscribeOn(Observable<T> source, Scheduler scheduler) {
        this.scheduler = scheduler;
        this.source = source;
    }

    @Override
    public void call(final Subscriber<? super T> subscriber) {
        //......暂时省略
    }
}

可以看到,OperatorSubscribeOn实现

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lisdye2/article/details/51113837

智能推荐

cocos2d-x中讲解TileMap地图编辑器的高级用法(1)_tilemap 编辑器 编辑高度-程序员宅基地

文章浏览阅读615次。来自: http://www.it165.net/pro/html/201211/4070.html有段时间没更新博客了,最近一直忙项目,下面就把我最近的新成果给大家分享一下。近段时间主要是在研究开发工具与游戏制作的结合,大家知道工欲善其事必先利其器,一款好的方便的开发工具能够极大的提高游戏的开发效率,特别是在制作关卡这些东西的时候,这也就是为什么国外现在有这么多的开发_tilemap 编辑器 编辑高度

gcc -nostartfiles; -nodefaultlibs; -nostdlib;-f...-程序员宅基地

文章浏览阅读3.4k次。为什么80%的码农都做不了架构师?>>> ..._-nostartfiles

Windows 7下:应用程序无法正常启动(0xc0150002)_win7应用程序无法正常启动0xc0150002解决方法-程序员宅基地

文章浏览阅读1.8w次。在新系统中正确安装QQ2010无法运行,同时安装的TM2009也无法运行。同样显示为“应用程序无法正常启动(0xc0150002)。请单击“确定”关闭应用程序”。在百度,Google中搜索中发现有许多人遇到了同样的问题,而且软件也不限于腾讯软件,有摄像头、CAD的各种软件。 打开查看后发现大多数答案并不正确,也无法解决这个问题。经过我的研究以上软件,发现_win7应用程序无法正常启动0xc0150002解决方法

知识点十八:字符串匹配算法(Ⅰ)—— BF/RK算法-程序员宅基地

文章浏览阅读753次。前言字符串匹配这样一个功能,对于任何一个开发工程师来说,应该都不会陌生。我们用的最多的就是编程语言所提供的字符串查找函数,比如 Java 中的 indexOf(),Python 中的 find() 函数等,它们底层就是依赖字符串匹配算法。字符串匹配算法很多,两种比较简单的、比较好理解的是:BF 算法和 RK 算法。比较难理解、但更加高效的有:BM 算法和 KMP 算法。这四种都是单模式串匹配算法...

JVM常用基础参数-栈内存Xss讲解_jvm xss-程序员宅基地

文章浏览阅读2.2w次,点赞8次,收藏54次。JVM常用基础参数-栈内存Xss讲解大厂面试题:1、JVM垃圾回收时候如何确定垃圾?是否知道什么是GC Roots2、你说你做过JVM参数调优和参数配置,请问如何盘点查看JVM系统默认值3、你平时工作中用过的JVM常用基本配置参数有哪些?4、强引用、软引用、弱引用、虚引用费别是什么?5、请你谈谈对OOM的认识6、GC垃圾回收算法与垃圾收集器的关系?分别是什么请你谈谈?..._jvm xss

jQuery实现的多滑动门和多选项卡效果_jquery滑动门-程序员宅基地

文章浏览阅读73次。在网页设计和开发中,滑动门(sliding doors)和选项卡(tabs)是常用的交互效果,它们可以为网页添加动态和互动性。本文将介绍如何使用jQuery库实现多滑动门和多选项卡效果,并提供相应的源代码。通过绑定合适的事件和操作DOM元素的CSS类,我们可以为网页添加动态和交互性。的元素上时,它的宽度会从100像素动画缓慢地增加到200像素,持续时间为300毫秒。选项卡效果常用于切换不同内容或功能区域,用户可以通过点击选项卡来显示相应的内容。标签中,多个具有相同类名的选项卡将具备切换显示内容的效果。_jquery滑动门

随便推点

晶体封装越小esr越大_晶振与晶体的参数详解-程序员宅基地

文章浏览阅读426次。1. 晶振与晶体的区别1) 晶振是有源晶振的简称,又叫振荡器。英文名称是oscillator。晶体则是无源晶振的简称,也叫谐振器。英文名称是crystal.2) 无源晶振(晶体)一般是直插两个脚的无极性元件,需要借助时钟电路才能产生振荡信号。常见的有49U、49S封装。3) 有源晶振(晶振)一般是表贴四个脚的封装,内部有时钟电路,只需供电便可产生振荡信号。一般分7050、5032、3225、252..._晶体 电阻 大小

微信支付兴起,万亿级用户交易记录存储的挑战-程序员宅基地

文章浏览阅读3.9k次。背景:2013年8月,微信红包上线。2014年春节微信红包引爆社交支付。2015年春晚红包摇一摇,推动微信红包在全国迅速普及。此后,每逢节假日或特殊日子,人们都会自主的兴起发红包,使微信红包成为热点。微信红包的火热带动微信支付的迅猛发展,按当时的发展速度预估,到2015年底,每天的微信支付交易记录会达到20亿。而原有的用户交易记录存储系统无法承受业务迅猛发展带来的冲击,一些瓶颈逐渐凸显出来。本文将_微信支付交易量如何存储

MAC开发工具:ITERM2 log自动保存相关配置_iterm log plain text-程序员宅基地

文章浏览阅读1.6k次。上图中的“Automatically log session input to file in :”勾选后选定地址即可_iterm log plain text

VMWARE提示用户已取消该操作_vm用户已取消该操作-程序员宅基地

文章浏览阅读1.6w次。提示“用户已取消该操作的”解决办法_vm用户已取消该操作

python中对文件路径的获取_python获取文件路径-程序员宅基地

文章浏览阅读2.6w次,点赞12次,收藏98次。获取文件路径基本方法_python获取文件路径

三范式分解算法-程序员宅基地

文章浏览阅读1w次。三范式是BC范式的放宽 三范式条件(满足一个即可): 1. α–&gt;β是平凡的函数依赖,除了子集和父集的函数依赖,大多的函数依赖都是非平凡的 2. α是关系模式R的一个超码 3. (β-α)属性集里的所有属性都被包含在 R的candidate key里,注意 (β-α)的属性集里的所有元素,可以 分别被包含在多个 candidate key中三范式分解算法伪代码如下://在关..._三范式分解算法

推荐文章

热门文章

相关标签