RxJava原理分析

RxJava之线程切换原理分析  Scheduler翻译成中文就是“调度”的意思,在RxJava里就是线程之间的调度,也就是线程之间的切换。在RxJava里默认有5种实现。  从图中可以简单看出,SingleScheduler、ComputationScheduler、IoScheduler、NewThreadScheduler的核心实现就是一个线程池,但该线程池里只会有一个线程,而newScheduledThreadPool... 阅读详情

RxJava 的核心思想的理解?

​ 有一个起点和一个终点,从起点开始把我们的“事件”流向终点,只不过在流的过程中可以增加拦截,对“事件”进行改变,终点只关心它的上一个流程。

RxJava的核心:订阅流程、线程切换。

源码基于 io.reactivex.rxjava2:rxjava:2.1.12;

首先看下正常的 RxJava 使用方法:

    Observable.create(new ObservableOnSubscribe<String>() {
   
   
        @Override
        public void subscribe(@NonNull ObservableEmitter<String> emitter) throws Exception {
   
   
            emitter.onNext("A");
        }
    }).subscribe(new Observer<String>() {
   
   
        @Override
        public void onSubscribe(@NonNull Disposable d) {
   
   

        }

        @Override
        public void onNext(@NonNull String s) {
   
   
						// 这里可以收到 A
        }

        @Override
        public void onError(@NonNull Throwable e) {
   
   

        }

        @Override
        public void onComplete() {
   
   

        }
    });

然后我们先后从 Observer(订阅者,观察者),Observable(发布者,被观察者),subscribe(订阅)来看下具体的流程。

订阅流程

1. Observer 源码
public interface Observer<T> {
   
   

    /**
     * 为观察者提供以同步方式(从onNext(Object) )和异步方式取消(处置)与Observable的连接(通道)的方法。
     *
     * 参数:d –可随时调用其Disposable.dispose()的Disposable实例以取消连接
     * 自从:2.0
     */
    void onSubscribe(@NonNull Disposable d);

    /**
     * 为观察者提供一个新的观察对象。
     * Observable可以多次调用此方法。
     * Observable调用onComplete或onError之后,将不会再次调用此方法。
     *
     * 参数:t –可观察对象发射的项目
     */
    void onNext(@NonNull T t);

    /**
     * 通知观察者Observable发生错误情况。
     * 如果Observable调用此方法,则此后将不再调用onNext或onComplete 。
     */
    void onError(@NonNull Throwable e);

    /**
     * 通知观察者Observable已完成基于推送的通知的发送。
     * 如果Observable调用onError则它将不会调用此方法。
     */
    void onComplete();

}
2. Observable 创建过程

首先看下 Observable.create 的代码:

    @CheckReturnValue
    @SchedulerSupport(SchedulerSupport.NONE)
    public static <T> Observable<T> create(ObservableOnSubscribe<T> source) {
   
   
        ObjectHelper.requireNonNull(source, "source is null");
        return RxJavaPlugins.onAssembly(new ObservableCreate<T>(source));
    }

在 ObservableCreate 中只是把自定义的 source 赋了个值,保存了一下:

public final class ObservableCreate<T> extends Observable<T> {
   
   
    final ObservableOnSubscribe<T> source;

    public ObservableCreate(ObservableOnSubscribe<T> source) {
   
   
        this.source = source;
    }
}

在 RxJavaPlugins.onAssembly 中什么都没做,很多操作符都会经过 onAssemly 的全局监听。传入什么就返回什么:

    /**
     * 调用关联的钩子函数。
     *
     * 参数:来源–挂钩的输入值
     * 类型参数:<T> –值类型
     * 返回值:钩子返回的值
     */
    @SuppressWarnings({
   
    "rawtypes", "unchecked" })
    @NonNull
    public static <T> Observable<T> onAssembly(@NonNull Observable<T> source) {
   
   
      	// f 默认都是 null
        Function<? super Observable, ? extends Observable> f = onObservableAssembly;
        if (f != null) {
   
   
            return apply(f, source);
        }
      	// 直接返回
        return source;
    }
3. subscribe 订阅过程

首先看下订阅的代码:

    @SchedulerSupport(SchedulerSupport.NONE)
    @Override
    public final void subscribe(Observer<? super T> observer) {
   
   
        ObjectHelper.requireNonNull(observer, "observer is null");
        try {
   
   
          	// 同上面 RxJavaPlugins.onAssembly 一样 原样返回
            observer = RxJavaPlugins.onSubscribe(this, observer);

            ObjectHelper.requireNonNull(observer, "Plugin returned null Observer");
						// 会跳到 ObservableCreate 的subscribeActual方法
            subscribeActual(observer);
        } catch (NullPointerException e) {
   
    // NOPMD
            throw e;
        } catch (Throwable e) {
   
   
           // 这里省略不相关的代码
            throw npe;
        }
    }

在 ObservableCreate 中 subscribeActual 的代码如下:

    @Override
    protected void subscribeActual(Observer
Rxjava源码分析&实践(三)【RxJava基本原理分析之订阅流】 本节,我们从Rxjava使用代码入手,去结合自己已有的知识体系,加查阅部分源码验证的方式,来一起探索一下Rxjava实现的基本原理。为了本文原理分析环节,可以被更多的人理解、学习,所以小编从初学者的角度,从使用入手,一点点的分析了其中的源码细节、思想,建议大家随着本文的章节步骤,一步一步的来阅读,才能更快、更好的理解Rxjava的真正的思想精髓,也为我们之后的实践课程留一个好的底子。 阅读详情

相关推荐

Rxjava源码分析&实践(四)【RxJava基本原理分析之触发流】

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

itbird的专栏 816

Rxjava源码分析&实践(二)【RxJava基本原理分析之构建流】

本节,我们从Rxjava使用代码入手,去结合自己已有的知识体系,加查阅部分源码验证的方式,来一起探索一下Rxjava实现的基本原理。为了本文原理分析环节,可以被更多的人理解、学习,所以小编从初学者的角度,从使用入手,一点点的分析了其中的源码细节、思想,建议大家随着本文的章节步骤,一步一步的来阅读,才能更快、更好的理解Rxjava的真正的思想精髓,也为我们之后的实践课程留一个好的底子。

itbird的专栏 1046

【Cadence】Virtuoso@LayoutXL 差分电路版图镜像同步技巧详解

本文详细介绍了在Cadence Virtuoso LayoutXL中实现差分电路版图镜像同步的技巧,包括核心需求、环境配置、分步操作指南及高级技巧。通过使用LayoutXL的Group功能,工程师可以高效保持差分电路的对称性,提升版图迭代效率,确保高速信号处理的稳定性。特别适用于深亚微米工艺下的差分放大器设计。

weixin_29215391的博客 323

高等数学/概率论/数理统计/线性代数/离散数学面试-核心概念-问题理解

特征值与特征向量是线性代数中的概念,它们与线性变换有关。在线性变换中,如果存在非零向量 v ,使得当该向量通过变换后,其方向不变,只是长度发生了变化,那么这个向量 v 就是特征向量。而这个长度变化的比例因子,即变换前后向量长度的比值,称为特征值。数学公式表示:通俗易懂的解释:想象一下,你有一个可以伸缩的橡皮筋,这个橡皮筋可以代表一个向量。现在,你有一个特殊的机器,它可以改变橡皮筋的形状,但不会改变它延伸的方向。当你把橡皮筋放入机器中,机器会拉伸或压缩橡皮筋,但橡皮筋的方向保持不变。

m0_64198455的博客 2292

从DC到DCG:手把手教你搭建物理感知综合流程(含DEF文件处理避坑指南)

本文详细介绍了从Design Compiler(DC)过渡到DC Topographical(DCT)和DC Graphical(DCG)的完整操作框架,特别针对DEF文件处理提供避坑方案。通过环境准备、工具升级、DEF文件处理、DCG综合配置等步骤,帮助开发者高效应对28nm以下工艺节点的物理感知综合挑战,显著提升时序收敛效率。

weixin_27966471的博客 380

ali140滑块

ali 140滑块采用补环境的方式进行逆向,需要的文件主要为这两个,其中collina.js是最主要的环境校验和参数加密的逻辑,这两个文件放本地进行补环境。然后挂上代理,先保证能够正常运行代码,补了些许后能够正常运行了,我们打印最主要的加密函数看看:n值就是得到:挂上代理看看鼠标事件,不管加密逻辑,关心入参即可:收集一些鼠标事件传进记录的函数。其余就是处理一些环境值,一些resetSA的逻辑就行。截图记录:

bboysteed的博客 1677

基于ESP32-S3的电子吧唧DIY:蓝牙传图、触摸交互与动态显示全解析

本文详细解析了如何利用ESP32-S3芯片DIY一个功能丰富的电子吧唧(智能徽章)。项目核心实现了通过蓝牙低功耗(BLE)接收手机小程序发送的图片,并存储至文件系统,最终在带触摸功能的TFT屏幕上进行动态显示与交互。教程涵盖了从硬件选型、软件开发环境搭建,到蓝牙通信、图片处理与触摸功能实现的完整步骤,并分享了实用的调试技巧,适合创客和嵌入式爱好者动手实践。

weixin_42510243的博客 674

Qt6安装保姆级教程:从国内镜像下载到配置避坑指南(附清华/中科大源)

本文提供详细的Qt6安装与配置指南,重点介绍如何利用清华大学、中国科学技术大学等国内镜像源解决下载速度慢的问题。内容涵盖在线安装器获取、组件选择策略、环境变量配置以及常见编译与部署问题的排查方法,旨在帮助国内开发者高效、顺畅地完成Qt6开发环境搭建。

weixin_29281915的博客 633

2024年游戏策划最新面试题及答案

1. **游戏策划**:负责游戏设计和开发的创意和技术过程。2. **主要职责**:设计游戏玩法、故事、角色、世界等。4. **游戏机制**:定义玩家如何与游戏世界互动的规则。13. **引人入胜的角色**:深入的背景故事、个性特征。3. **游戏平衡**:确保游戏公平、有趣且具有挑战性。7. **RPG特点**:角色发展、故事驱动、玩家选择。12. **关卡设计技巧**:挑战性、流动性、视觉引导。11. **游戏关卡设计**:创建游戏世界的不同阶段。5. **游戏循环**:玩家在游戏中重复的行为模式。

guo162308的博客 2320

在 FreeStyle SAP UI5 应用里优雅落地 Draft 草稿机制:用 DraftManager 封装 DraftController 的一套实战套路

SAP Fiori应用中,Draft草稿机制是解决业务中断、多人协作和长表单填写等痛点的核心能力。本文提出了一套针对FreeStyle SAP UI5应用的Draft管理方案,通过封装sap.ui.generic.app.transaction.DraftController为DraftManager服务类,将复杂的草稿操作逻辑集中管理。该方案实现了草稿的创建、激活、丢弃等核心功能,使控制器只需调用简单意图式API即可完成操作,同时解决了组件化架构下的上下文切换、统一错误处理等问题。文章还详细介绍了后端Dr

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 2751

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

假人有限元模型

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

上一篇: android面试题相关
下一篇: android app图标长按展示快捷方式 Shortcuts 类似3d touch
coder_yao
博客等级 码龄10年 9粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值