RxJava源码分析

Rxjava源码分析&实践(一)【RxJava的基本使用】 写在文章开头,小编明确,去使用自己已知的知识,结合我们之前讲过的设计模式相关知识,实现某个开源的三方框架,并不是目的,毕竟已有的框架、已有的知识总结一大堆,我们并非是要花费时间重复造轮子,而是借助这个自我实践过程,去进行自我的知识沉淀、累加,进而吃透相应框架,这才是最关键的。当然,也有另外一方面原因,大家发现我们一路走来,从刚开始的设计模式相关课程,到开源框架Eventbus、Butterknife、Rxjava、Okhttp、Glide,这些框架哪个不是很经典的,也许之前你怀疑过自己,但是当依靠自己已有知 阅读详情

RxJava源码分析基于RxJava1.3.8。


题外话:
在写这边博客之前曾犹豫过很久,因为RxJava的源码非常复杂,感觉不是在一两篇博客中就能讲解清楚。但是正式因为RxJava的源码非常复杂,我也想通过写博客的方式来加深自己对RxJava源码的认识,同时也算是做笔记了,能时不时的翻出来看看,以防止忘记。

概述

虽然RxJava2也发布了很长时间了,但是对于分析RxJava的工作原理,RxJava1的源码相对于RxJava2相对而言会容易很多(原因想必大家都很清楚,其实是因为RxJava2我也没有怎么用过,哈哈),所以对RxJava的源码分析依然选择使用RxJava1。

在本次RxJava的源码分析中,只针对开发中常用的也是必须掌握的操作符做具体分析,主要包括三方面:

  • 基本使用
  • 变换的原理
  • 线程切换的原理

至于其他的一些不常用的操作符(RxJava中有大量的操作)就不过多分析了。

这里非常推荐扔物线的博客:给 Android 开发者的 RxJava 详解

基本使用

Observable.create(new Observable.OnSubscribe<String>() {
    @Override
    public void call(Subscriber<? super String> subscriber) {
        subscriber.onNext("Hello");
        subscriber.onNext("RxJava!");
        subscriber.onCompleted();
    }
}).subscribe(new Subscriber<String>() {

    @Override
    public void onNext(String s) {
        System.out.println(s);
    }
    @Override
    public void onCompleted() {
        System.out.println("onCompleted");
    }

    @Override
    public void onError(Throwable e) {

    }
});

上述代码就是RxJava中的最基本使用,这个基本使用主要包括:

  1. 通过Observable.create()创建一个Observable(被观察者)对象。
  2. 创建一个Observer(观察者)对象,也就是Subscriber对象。
  3. 通过Observable.subscribe()实现Observable-Observer的订阅。
  4. 在Observable.subscribe()方法内部产生一个事件,通过OnSubscribe.call产生事件。
  5. 最终通过Observer对象处理事件。

基本订阅

源码分析

针对上文RxJava中的基本使用,这里会针对这个流程做源码分析。

subscribe方法

首先,在RxJava的调用流程中,Observable.subscribe()方法实现Observable和Observer的订阅,同时该方法也是整个RxJava链式调用的起点,所以首先看看Observable.subscribe()的内部逻辑。

public final Subscription subscribe(Subscriber<? super T> subscriber) {
    return Observable.subscribe(subscriber, this);
}

在上面方法中,仅仅只是调用了subscribe(Subscriber

static <T> Subscription subscribe(Subscriber<? super T> subscriber, Observable<T> observable) {
    // 省略部分代码

    // 1、初始化方法,内部没有任何实现
    subscriber.onStart();

    // 2、将参数subscriber包装成SafeSubscriber
    //    SafeSubscriber主要保证subscriber完成调用后能被及时取消订阅,并且在onComplete()调用后无法在被调用
    if (!(subscriber instanceof SafeSubscriber)) {
        // assign to `observer` so we return the protected version
        subscriber = new SafeSubscriber<T>(subscriber);
    }

    try {

        /**
         * 核心流程:
         * 
         *   1、首先, RxJavaHooks.onObservableStart()方法获取OnSubscribe对象
         *   2、然后,根据获取的OnSubscribe,调用该对象的call()方法,这里可以看到在call()方法中传入的subscriber对象就是在subscribe()方法传入的subscriber对象
         * 
         *      上面获取的OnSubscribe其实就是在创建Observable时通过create()方法创建的OnSubscribe对象
         */
        RxJavaHooks.onObservableStart(observable, observable.onSubscribe).call(subscriber);
        return RxJavaHooks.onObservableReturn(subscriber);

    } catch (Throwable e) {
        // 省略部分代码
    }
}

在subscribe()方法中,基本就完成了Observable对象和Subscriber的订阅,并通过OnSubscribe.call(Subscriber)开始整个链式调用。

在代码中,注释非常清晰,这里就不重复了。

这里需要注意的是通过RxJavaHooks获取OnSubscribe对象的流程,这里对RxJavaHooks.onObservableStart()的调用流程做了下梳理,如下:

public final class RxJavaHooks {

    // 1、定义一个Func2对象onObservableStart
    static volatile Func2<Observable, Observable.OnSubscribe, Observable.OnSubscribe> onObservableStart;


    // 2、静态代码块调用,实现初始化
    static {
        init();
    }

    // 3、初始化onObservableStart对象
    static void init() {
        // 省略部分代码

        onObservableStart = new Func2<Observable, Observable.OnSubscribe, Observable.OnSubscribe>() {
            @Override
            public Observable.OnSubscribe call(Observable t1, Observable.OnSubscribe t2) {
                // 在该代码中,默认返回方法参数的OnSubscribe对象
                return RxJavaPlugins.getInstance().getObservableExecutionHook().onSubscribeStart(t1, t2);
            }
        };

    }

    // 4、调用onObservableStart(),获取具体的OnSubscribe
    public static <T> Observable.OnSubscribe<T> onObservableStart(Observable<T> instance, Observable.OnSubscribe<T> onSubscribe) {
        Func2<Observable, Observable.OnSubscribe, Observable.OnSubscribe> f = onObservableStart;
        // 变量onObservableStart不会为空,所以会执行if判断语句
        if (f != null) {
            // 该方法会返回参数onSubscribe,也就是Observable.OnSubscribe对象
            return f.call(instance, onSubscribe);
        }
        return onSubscribe;
    }

}

所以,通过上述流程发现最终获取的OnSubscribe对象,还是创建Observable对象时创建的那个OnSubscribe对象。

总结

这样关于RxJava的基本使用的源码分析就到这里了,这里面的核心流程也就是Subscriber.subscribe()方法,该方法是实现响应式编程的核心方法。

当然,在基本使用中对于Observerable.OnSubscribe类的作用并没有很突出,在下一章节中将主要讲解RxJava变换的原理。在变换的流程中就是要对Subscriber.subscribe()和Observerable.OnSubscribe两个方法的方法

Rxjava源码分析&实践(四)【RxJava基本原理分析之触发流】 整个过程,分为构建流、订阅流、触发流。从左到右执行不同的操作符的过程,其实很简单,就是根据不同的操作符,对原始的 observable进行逐层包装,这里可以看出,每层的节点 N* 就持有了上一层的observable。从右到左的 subscribe 调用过程,这个过程中,每个observable内部的subscribeActual执行两个关键操作,一个是对自己已有的observer进行一层重新包装,另外一个就是使用前面节点的observable,订阅包装好的observer。 阅读详情

相关推荐

rxjava-1.3.8.jar

rxjava 1.x版本,可用于在Eclipse编辑器中使用rxjava,导入Eclipse开发rxjava

解决msf扫描模块报错wrong argument type nil (expected String)

最近学习MSF,在跟着教材使用arp_sweep模块时运行报错: Error: 10.10.10.0-10.10.10.255: wrong argument type nil (expected String) 并且扫描不到存活主机,根据排查结果来看,这是未设置INTERFACE所导致的。 解决方法: ifconfig查看自己可用的网卡eth(x),并为arp_sweep模块设置...

帅气的吴先生的博客 1410

用Python搞定超效率SBM模型:从数据清洗到结果可视化全流程指南

本文详细介绍了如何使用Python实现超效率SBM模型,从数据清洗到结果可视化的全流程指南。超效率SBM模型作为传统DEA的进化版本,能有效处理非期望产出(如环境污染)并对高效单元进行精细排序。通过实战案例和代码示例,帮助读者掌握这一先进模型的Python实现技巧,提升效率评估的准确性和可视化效果。

silver的专栏 650

Wrong 1st argument type. Found: 'java.lang.String', required: 'org.jxmpp.jid.EntityJid

private ChatManager chatManager; private String friendJid; private void initChatManager(final Context context){ connection = MXMPPTCPConnection.getInstance(); if(connecti...

qq_37840864的博客 4292

深入浅出DDR系列(二)--DDR工作原理

学习完了DDR的基本组成和硬件结构原理之后,从整体上了解了DDR的特性和静态图,包括原理、管脚图等。那么本章就要从动态的角度来分析时序结构,包括read/write的整个过程到数据返回发生了什么,其中包括以下内容 DDR是如何完成Read、Write 等的操作 DDR的基本命令 DDR的时序参数 DDR的性能分析 1. DRAM基本组成 对于DRAM,其主要由行和列组成,每一个bit中都是由类似右下图的类晶体管的结构组成,对于sdram的数据,可以通过控制column和row就可以访问sd

奇小葩 3万+

Vue3 与 Bpmn-js:打造现代化 BPMN 流程设计器

随着业务流程的复杂化,流程设计器成为企业级应用中不可或缺的一部分。BPMN(Business Process Model and Notation)是一种标准的业务流程建模语言,广泛应用于业务流程管理。本文将介绍如何使用 Vue3 和 Bpmn-js 打造一个现代化的 BPMN 流程设计器。

九天的专栏 2116

RXJava源码分析

流程分析:对于被观察者来说,装饰器模式体现在subscribeActual方法对于观察者来说,装饰器模式体现在onNext方法。

Allence的博客 1116

BurpSuit在不同浏览器中配置代理

文章通过分享各大浏览器如何设置代理的知识,帮助初学者快速掌握代理配置相关技能。

北冥同学的成长记录笔记 1万+

一看就懂的RxJava源码分析

本文对于RxJava的源码进行分析,以更加彻底的了解RxJava的实现思路。

Mekeater的博客 2394

R语言实战:从Raw Counts到TPM/FPKM的完整转换指南(含代码调试技巧)

本文详细介绍了在R语言环境中将RNA-seq原始计数(raw counts)转换为TPM/FPKM值的完整流程,包含代码实现和常见错误调试技巧。通过具体案例演示如何正确处理基因长度和测序深度因素,实现表达量标准化,为生物信息学分析提供可靠数据基础。特别适合需要进行转录组数据分析的研究人员和实验室技术人员参考。

weixin_28559803的博客 478

CATIA二次开发——遍历几何图形集下的轴系及控制轴系生成位置

CATIA二次开发——轴系相关问题1.遍历几何图形集下的轴系2.解决轴系生成位置的问题 1.遍历几何图形集下的轴系 近期遇到的问题:遍历轴系的时候发现,AxisSystem属性的轴系只有放在轴系集合下,才能被找到,放在几何图形集或其他位置均不能被找到。本来想遍历几何图形集下的轴系元素,但是发现没有对应的属性,只能查找 几何图形集、几何元素、草图等元素,无法直接遍历轴系。 解决办法:(加入选择集,在选择集中筛选轴系类型) HybridBody axisHB = activePart.HybridBodies

WorkMan的博客 2731

9、RxJava源码分析

Introduction · ReactiveX文档中文翻译 https://github.com/ReactiveX/RxJava RxJava3框架的使用 Android响应式编程——RxJava3框架的使用(一)_e电动小马达e的博客-优快云博客_rxjava3 Android响应式编程——RxJava3框架的使用(二)_e电动小马达e的博客-优快云博客 Android响应式编程——RxJava3框架的使用(三)_e电动小马达e的博客-优快云博客_rxjava3 Android响应.

lanxuan1993的博客 899

【局部规划模块轨迹优化算法】Teb_planner规划算法

认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长!本文先对****做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章提示:以下是本篇文章正文内容由于ROS中的局部路径规划器比较老了,所以我推荐大家使用比较新的局部路径规划器teb_local_planner。teb_local_planner是基于弹性时间带碰撞约束的算法,算法将动态障碍物、运行时效、路径平滑性等约束做综合考虑,在复杂环境下有更优秀的表现。

qq_35635374的博客 951

RxJava2源码分析

RxJava2源码分析 RxJava的鼎鼎大名相信Android开发的同学都非常熟悉了,其实不仅仅有RxJava,还有RxJs,RxKotlin等等一系列。可以说Rx并不是一种局限于Android的框架,Rx是一种思想,我们深入了解了RxJava,同样会加深我们对其他Rx系列的认知。 使用方法 我们来看一个常见的例子: Observable.create(ObservableOnS...

BlackFlagBin的博客 307

2023全国职业技能大赛 网络系统管理 服务部署 Linux部分--基础配置

服务器和客户端基本配置如下表,各虚拟机已预装系统。一、关闭防火墙和Selinux。七、需要使用到的命令详解。三、修改root密码。

weixin_62926639的博客 1000

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Rxjava源码分析

一、RxJava案例和流程 // 结论: new ObservableCreate() {source == 自定义source} // 2:Observable创建过程 源码分析 Observable.create( // 自定义source new ObservableOnSubscribe<String>() { @Override publi.

qq_26414049的博客 260

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

rxjava源码分析

RXjava响应式编程此文作者大暴雨原创,转载请注明出处。如果线程的知识不是很丰富,请先查看 rxjava源码中的线程知识 一文rxjava总结就是:异步实现主要是通过扩展观察者模式首先我们看一下只有一条线程是怎么实现响应式的。这比较简单。首先看一下Observable这个类(被观察者),还有Subscriber (观察者),Subscriber实现了Observer 类。...

aige7874的博客 197

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Rxjava_自己实现Rxjava map转换及源码分析

自己实现Rxjava map转换及源码分析

涂文远的博客 409

Rxjava2源码分析二

Rxjava学习二 我们继续上一节的内容,这一节的内容主要是线程的调度。 1、observeOn 给下面代码分配线程 代码如下: //完整版的被观察者 Observable.create( //自定义的被观察者,String类型, new ObservableOnSubscribe<String>() { @Override public

qq_34606099的博客 229

Rxjava源码分析之IO.Reactivex.CompositeDisposable

Rxjava系列文章,从入门到精深循序渐进式分析讲解。自我总结归纳防加强自己的知识体系构建,希望能帮助路过的你。

luo_boke的博客 1666

Android框架源码分析——RxJava源码分析

1、基本订阅流程 使用实例 Observable.create(ObservableOnSubscribe<String> { e -> e.onNext("A") }) .subscribe(object : Observer<String>{ override fun onComplete() { } override fun ...

浅谈Android 569

Android-RxJava源码分析

最简单的源码分析//创建一个上游 Observable: Observable&lt;Integer&gt; observable = Observable.create(new ObservableOnSubscribe&lt;Integer&gt;() { @Override public void subscribe(ObservableEmitter&lt;Integer&...

Abe的学习之路 443

Rxjava 源码分析Zip与combinelatest区别

实验 public static void main(String[] args) { testZip(); testComb(); } public static void testZip() { Observable<Integer> obs1 = Observable.just(1, 2, 3, 4, 5, 6, 7); Observable<Integer> obs2 = Observable

huihuishou_su的博客 633
上一篇: Retrofit2源码分析(2) CallAdapter详解
下一篇: RxJava源码分析(2) 变换原理
Kerwin zhang
博客等级 码龄12年 21粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值