rxjava2源码分析

news2024/11/14 3:54:23

目录

一,Observable调用流程

1.1 简单Observable.create()创建调用流程

1.2 map操作符

1.3 flatmap操作符

1.4 subscribeOn操作符

1.5 observeOn操作符



一,Observable调用流程

1.1 简单Observable.create()创建调用流程

上面的这个流程图是下面这段代码调用流程图

Observable.create(object :ObservableOnSubscribe<String>{
            override fun subscribe(emitter: ObservableEmitter<String>) {
                emitter.onNext("a")
            }

        }).subscribe({
            Log.d(TAG,"======== onNext value = $it")
        },{
            Log.d(TAG,"======== onError ")
        },{
            Log.d(TAG,"======== onComplete")
        },{
            Log.d(TAG,"======== onSubscribe")
        })
1.2 map操作符

Observable.create(object :ObservableOnSubscribe<Int>{
            override fun subscribe(emitter: ObservableEmitter<Int>) {
                emitter.onNext(1)
            }

        }).map { result->
                result.toString()+"map转换"

             }.subscribe({
            Log.d(TAG,"======== onNext value = ${it.toString()}")
        },{
            Log.d(TAG,"======== onError ")
        },{
            Log.d(TAG,"======== onComplete")
        },{
            Log.d(TAG,"======== onSubscribe")
        })
1.3 flatmap操作符

Observable.create(object : ObservableOnSubscribe<Int> {
            override fun subscribe(emitter: ObservableEmitter<Int>) {
                emitter.onNext(1)
            }

        }).flatMap(object : Function<Int, ObservableSource<out String>> {
            override fun apply(t: Int): ObservableSource<out String> {
                return Observable.just("${t.toString()}flatmap")
            }

        }).subscribe({
            Log.d(TAG, "======== onNext value = ${it.toString()}")
        }, {
            Log.d(TAG, "======== onError ")
        }, {
            Log.d(TAG, "======== onComplete")
        }, {
            Log.d(TAG, "======== onSubscribe")
        })
1.4 subscribeOn操作符

 Observable.create(object : ObservableOnSubscribe<Int> {
            override fun subscribe(emitter: ObservableEmitter<Int>) {
                Log.d(TAG, "======== subscribe 当前线程是${Thread.currentThread().name} ")

                emitter.onNext(1)
            }

        }).subscribeOn(Schedulers.io())/*  .observeOn(AndroidSchedulers.mainThread())*/
            .subscribeOn(Schedulers.newThread())
            .subscribe(MyObserver())

通过多次切换订阅线程,发现只有第一次生效,

看下日志:

 D  ======== setOnObservableAssembly apply
2023-10-09 20:30:20.440 28448-28448 com.exampl...deActivity com.example.myapplication            D  ======== setOnObservableAssembly apply
2023-10-09 20:31:53.456 28448-28448 com.exampl...deActivity com.example.myapplication            D  ======== setOnObservableAssembly apply
2023-10-09 20:32:41.050 28448-28448 com.exampl...deActivity com.example.myapplication            D  ======== onSubscribe 当前线程是main

根本原因是在订阅的时候

会根据这个订阅源不断的去找上个源,那么到这里就明白了,当前切换线上的会被新的订阅源替代,所以就是为什么多次切换线程只有第一次生效原因

1.5 observeOn操作符

对于observeOn多次切换只有最后一次生效,根本原因是

在ObservableObserveOn对下里面,每次调用onNext的时候都会进行一次线程切换,如果还有后续的Observe,那么就会继续调用这个对应的Observe的onNext方法,虽然每调用一次当前的线程会切换一次,但是最终的消费地方是在业务定义的那个Observe,这个是业务的地方,也就是我们业务真正关系的地方的线程切换

Observable.create(object : ObservableOnSubscribe<Int> {
            override fun subscribe(emitter: ObservableEmitter<Int>) {
                Log.d(TAG, "======== subscribe 当前线程是${Thread.currentThread().name} ")

                emitter.onNext(1)
            }

        }).observeOn(AndroidSchedulers.mainThread())
            .observeOn(Schedulers.io())
            .subscribe(MyObserver())

对于这种多次切换的时候,那么看日志

 ======== setOnObservableAssembly apply
2023-10-10 20:08:28.113 10087-10087 com.exampl...deActivity com.example.myapplication            D  ======== setOnObservableAssembly apply
2023-10-10 20:08:28.117 10087-10087 com.exampl...deActivity com.example.myapplication            D  ======== onSubscribe 当前线程是main
2023-10-10 20:08:28.117 10087-10087 com.exampl...deActivity com.example.myapplication            D  ======== subscribe 当前线程是main 
2023-10-10 20:08:28.301 10087-10132 com.exampl...deActivity com.example.myapplication            D  ======== onNext value = 1 当前线程是RxCachedThreadScheduler-1

最后左右一次切换生效到最终的业务上

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1079701.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

河北吉力宝搭建中国鞋业全产业链生态流通体系

中国鞋业&#xff0c;一直以来都是劳动密集型产业的代表&#xff0c;传统的制造和销售方式已经不能满足当今市场的需求。在这个充满机遇和挑战的时代&#xff0c;河北吉力宝旗下的品牌步力宝&#xff0c;以鞋为媒介&#xff0c;积极参与商业创新&#xff0c;正引领中国鞋业向前…

idea提交git项目,提交代码 点击commit一闪而过,没有反应的解决办法

idea提交git项目&#xff0c;提交代码 点击commit一闪而过&#xff0c;没有反应的解决办法 一般有两种情况导致一闪而过&#xff0c;一种为git设置问题&#xff0c;一种是编码问题&#xff0c;解决方案如下&#xff1a; 1、在单文件提交时不会遇到这种情况&#xff0c;但是在…

Java架构师缓存通用设计方案

目录 1 采用多级缓存2 缓存数据尽量前移3 静态化4 数据平衡策略5 jvm缓存的问题6 redis存放数据解决7 redis垂直拆分8 总结1 采用多级缓存 对于高性能的缓存设计呢,咱们前面按照专题详细去进行的讲解。那咱们现在结合着咱们实际的应用呢,再来确定一下咱们怎么去做这个高性能的…

colab切换目录的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

【java|golang】多字段排序以及排序规则

奖励最顶尖的 K 名学生 给你两个字符串数组 positive_feedback 和 negative_feedback &#xff0c;分别包含表示正面的和负面的词汇。不会 有单词同时是正面的和负面的。 一开始&#xff0c;每位学生分数为 0 。每个正面的单词会给学生的分数 加 3 分&#xff0c;每个负面的词…

品牌低价的形式有哪些

线上产品五花八门&#xff0c;价格也有高低&#xff0c;但有时同一款商品&#xff0c;看似页面价一样&#xff0c;计算完促销信息后的到手价都会有所不同&#xff0c;有些店铺甚至会使用隐藏优惠券&#xff0c;如咨询客服领券、新人券等&#xff0c;而这些丰富的优惠方式&#…

华为OD机试 - 最大括号深度 - 栈stack(Java 2023 B卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#…

深入剖析 | 近期法院判决是不是司法部门有意平衡 SEC 监管天平

出品 &#xff5c;欧科云链研 究院 作者&#xff5c;Matthew Lee 9月27日&#xff0c;SEC 主席 Gary Gensler 参加了美国众议院金融服务委员会听证会。听证会审查 SEC 自 2021 年 10 月 5 日以来的一段时间内的监管发展、规则制定和活动&#xff0c;其中包括 SEC 提议修改“交易…

python图片:获得颜色占比,图片尺寸

꧂ 获得颜色占比&#xff0c;图片尺寸꧁ 要获取图片的尺寸、大小和颜色占比大于0.001的颜色值&#xff0c;可以基于上一个回答中使用Pillow库的代码进行修改。 from PIL import Image# 输入图片路径 image_path input("请输入图片路径: ")try:# 打开图片文件image …

零售超市商家怎么做微信小程序

随着互联网的发展&#xff0c;越来越多的零售超市商家开始关注如何借助微信小程序引流&#xff0c;以提高销售额和客户满意度。下面将介绍几个策略&#xff0c;帮助零售超市商家借助微信小程序实现引流。 首先&#xff0c;商家需要开发一款适合自己的微信小程序。小程序是一种轻…

win11右键菜单显示更多的设置方法

用了一年多win11系统了&#xff0c;Win11最大的变化之一莫过于右键菜单发生了变化。右键菜单很多时候需要点两次&#xff0c;实在是反人类&#xff0c;太麻烦了。 必须使用“显示更多选项”的右键菜单。 今天分享一个使用命令行更改右键菜单显示更多的设置方法&#xff1a; …

生鲜店怎么做微信小程序

在当今数字化时代&#xff0c;微信小程序已经成为了一种新的商业形态&#xff0c;为各类商家提供了丰富的获客和拉新手段。对于生鲜店来说&#xff0c;如何借助微信小程序来吸引新客户并提高销售额&#xff0c;成为了必须面对的重要问题。本文将为你提供一些实用的策略和建议&a…

【C/C++】 const

1、C语言的const 1、在C语言中 const修饰的局部变量保存在栈区 虽然不能通过const修饰的变量去修改栈区内容,但是可以 通过地址去修改 2、const修饰的全局变量是保存在常量区,不能通过变量名去修改.也不能通过地址去修改 3 、const修饰的全局变量,如果其他文件想使用,直接exte…

空间精密定位与导航VR模拟培训软件突破了时空限制

随着科技的飞速发展&#xff0c;测绘遥感技术逐渐成为地理信息获取的重要手段。然而&#xff0c;传统的测绘展示方式存在着诸多局限性&#xff0c;无法充分展现出测绘数据的精细化和多元化&#xff0c;成为为解决这一难题的有效途径。 测绘工程专业作为时下就业率爆棚的专业之一…

01、python基础知识:

1、注释 多行注释 单行注释 2、 数据类型 3、标识符 关键字 常用的标识符&#xff1a; 常用关键字&#xff1a; 4、输入输出 4.1 格式化输出: 格式化符号 占位符&#xff1b; 5、运算符、 数据类型转化&#xff1a; 1、字符串&#xff1a; 1.1、格式&#xff1a; 单引号、…

css实现排行榜样式(vue组件)

先看效果图&#xff1a; <template><div class"lawyer-refund-wrap"><div class"content"><divv-for"(item, index) in dataList" :key"index":style"{width: calc(100% - ${(index 1) * 10}px)}"c…

VGG卷积神经网络实现Cifar10图片分类-Pytorch实战

前言 当涉足深度学习&#xff0c;选择合适的框架是至关重要的一步。PyTorch作为三大主流框架之一&#xff0c;以其简单易用的特点&#xff0c;成为初学者们的首选。相比其他框架&#xff0c;PyTorch更像是一门易学的编程语言&#xff0c;让我们专注于实现项目的功能&#xff0…

计算机毕业设计选题推荐-springboot 教材管理系统

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

Android项目打包aar(kts)

目录 app build.gradle.kts AndroidManifests 按步骤生成 生成结果 双击查看内容 app build.gradle.kts plugins {id("com.android.application")id("org.jetbrains.kotlin.android")id("kotlin-parcelize")id("kotlin-kapt") …

推荐开源工具带带弟弟ocr_ddddocr_各种验证码都可以识别_滑动_点击_等等---验证码识别工作笔记001

这个很强大了,常见的各种验证码都可以识别,如果你项目上也有需要,比如需要实现系统的自动登录,这个时候就很有用了,这里仅仅给出方案,具体如何用,用的时候在做研究吧,好东西要记录,分享给需要的人.使用的时候 自己去查一下如何使用非常简单. 支持点击的验证码,支持数字验证码就…