首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Rxjava 线程切换原理

前言 rxjava 可以很方便的进行线程切换, 那么rxjava是如何进行线程切换的呢?阅读本文可以了解下rxjava 是如何进行线程切换的及线程切换的影响点。...WanRxjava ", "onComplete td ==" + Thread.currentThread().getName()); } }); 如上代码,实现了线程切换和观察者被观察者绑定的逻辑...调用Observer.OnSubscribe 方法是 不受线程调度影响的 b.subscribeOn 影响的是发送事件的线程 c.observerOn 影响的是观察者处理接受数据的线程,如果没有调用observeOn...则不会进行包装成 ObserveOnObserver,也就是说不会执行观察者的线程切换,和 发送者的线程一致 d.多次调用subscribeOn切换线程,每次都会new ObservableSubscribeOn...,触发事件发送时会往上调用,也就是第一次调用的subscribeOn传入的线程 会执行发送事件,后面的线程切换无效 e.Observer.OnSubscribe 只会执行一次,因为调用DisposableHelper.setOnce

1.1K00

详解 RxJava2 的线程切换原理

读了这篇文章你将会收获什么 RxJava2 基本的运行流程(并不会详述) RxJava2 线程切换原理 为什么 subscribeOn() 只有第一次切换有效 RxAndroid 简单分析 PS:建议您对...image RxJava2 线程切换原理 一、observeOn() 的线程切换原理 根据运行流程来看 observeOn() 执行后是得到 ObservableObserveOn 对象,那么当 ObservableObserveOn...outputFused) { drainFused(); } else { drainNormal(); } } 二、subscribeOn() 的线程切换原理...其实它的原理RxJava 自带的那些线程调度器一样,如果你想了解 RxJava 的 IO 线程池,什么的可以自己看一看,我这里分析 RxAndroid 主要有以下几点原因 弄清楚 RxAndroid...这个库的具体作用 弄清楚他是怎么就能把线程切换到主线程(他是怎么提供的主线程环境) 弄清楚线程调度器的运行原理 最重要的是它相对于 RxJava 自带的那些调度器,他比较简单容易分析 正文开始 首先我们找一下入口

3K20
您找到你想要的搜索结果了吗?
是的
没有找到

再忆RxJava---线程切换

RxJava已经陆陆续续看了将近两年多了,觉得很有必要重新认识一下。而且最新github上都出了3.0了。...重新看一下,一来作为回顾,二来也算是学习一下3.0 在了解线程切换前,先回顾一下简单的同步操作 1.同步 Observable.create(new ObservableOnSubscribe...}); Observable.create会生成一个ObservableCreate,subscribe最终会调用ObservableCreate的subscribeActual方法 很明显,同步的原理很简单...异步线程切换流程图.png 简单来说,就是把所有的操作从右到左包装成一对观察者与被观察者的关系,然后通过发射器使所有的操作连续执行 4 流程举例 4.1 下载并显示图片 创建CreateEmitter,...,subscribe方法在IoScheduler线程中,很明显,其实是有效的,确实切换了。

48410

RxJava源码浅析(三): subscribeOn线程切换和多次切换

一、subscribeOn 这篇不仅看下subscribeOn线程切换本身,我们还要研究下多次subscribeOn为啥只有第一次有效。...(顺便说下,如果切换其他线程,比如subscribeOn(Schedulers.io()),那他最终创建的是IoScheduler类,是不是很好记。)...我们现在知道RxJava是逆向向上调用的,那我们就一步一步的调代码看看。...,有了前篇讲解,我们以已经了解了Rxjava基础订阅流程,知道了ObservableCreate如何执行任务,只不过我们现在是在指定线程中执行。...三、总结 对于OnSubscribe方法而言,不管subscribeOn怎么切换线程,他都不受影响,他是最先开始执行的且只执行一次,只针对最下游有效,对于订阅而言,线程切换只是改变当前observer的所属线程

1.8K50

RxJava2.X 源码分析(四):观察者线程切换原理

RxJava2.X 源码分析(三)中探索了RxJava2调用subscribeOn切换被观察者线程原理。...本次我们将继续探索RxJava2.x切换观察者的原理,分析observeOn与subscribeOn的不同之处。...继续实现我们在第一篇中定下的小目标 从Demo到原理 OK,我们的Demo还是上次的demo,忘记了的小伙伴可以点击RxJava2.X 源码分析(三),这里就不再重复了哦,我们直接进入正题。...的逃不多,也是采用装饰者模式,wrapper我们的Observable和Observer产生一个中间被观察者和观察中,通过中间被观察者订阅上游被观察者,通过中间观察者接收上游被观察者下发的数据,然后通过线程切换将数据传递给下游观察者...看到这里我们基本了解了observeOn的实现流程,同样是老套路,使用装饰者模式,中间Wrapper了我们的Observable和Observer,通过中间增加一个Observable和Observer来实现线程切换

62130

RxJava2.X 源码分析(三):订阅线程切换

本次我们将探索RxJava2.x线程切换的实现原理。做到知其然,知其所以然。 Ok,开始我们的探索之旅吧! 从Demo到源码 本次我们将在上次的demo基础了做点改动。 ? ?...版本1:不存在线程切换 observable.subscribe(observer); 输出结果: ? 版本2:切换线程切换操作是如此的潇洒) ? 输出结果: ?...没线程切换的版本: 1、在那里调用subscribe,则都在当前线程执行。...存在版本切换的版本: 1、被观察者的onSubscribe在调用subscribe的线程中执行 2、被观察者的subscribe在RxJava2的RxCachedThreadScheduler-1中运行...装饰者模式的使用贯穿了RxJava2的各处(个人理解),再次体会了设计模式的魅力。 由于本篇过长,observeOn订阅者线程切换就再分一篇吧。

57840

线程切换哪家强?RxJava与Flow的操作符对比

作者:fundroid 链接:https://juejin.cn/post/6943037393893064734#heading-13 Flow作为Coroutine版的RxJava,同RxJava一样可以方便地进行线程切换...本文针对两者在多线程场景中的使用区别进行一个简单对比。 1、RxJava 我们先来回顾一下RxJava中的线程切换 ?...如上,RxJava使用subscriberOn与observeOn进行线程切换 1.1 subscribeOn subscribeOn用来决定在哪个线程进行订阅,对于Cold流来说即决定了数据的发射线程...1.4 flatMap 结合上面介绍的RxJava线程切换,看下面这段代码 ? 如果我们希望loadData(id)并发执行,那么上面的写法是错误的。...然后将代码换成Flow的写法,主要遵循下列原则 RxJava通过observeOn切换后续代码的线程 Flow通过flowOn切换前置代码的线程 ?

83110

用户级多线程切换原理

前言 上文(从多进程到多线程)中,我们讨论了何为多线程,而线程又分用户级线程和内核级线程,这节我们先来讨论一下何为用户级线程以及用户级线程的底层原理。...内核级线程,顾名思义,它的调度是依赖于操作系统的,即操作系统控制着内核级线程切换,比如有A和B两个内核级线程,我们用户是不知道先执行哪个线程的代码和不知道什么时候切换到另一个线程执行代码的,这件事只有操作系统知道...用户级线程 我们举例子,来进一步说明用户级线程切换的底层原理,还是记住那句话:用户级线程切换是由我们用户来主动控制的。 现在我们假设有线程1和线程2两个线程(图中红色的数字为内存的地址) ?...,此时即进行了线程切换。...这一节,我们讲述了内核级线程和用户级线程的基本概念与区别、用户级线程切换底层原理

2.5K30

RXJava原理_JavaScript的执行原理

RXJava简单理解 首先,rxjava是什么?...其实对于刚接触rxjava的宝宝而言,只需要掌握两点: 观察者模式 异步处理 观察上图,清楚生动刻画出了rxjava的观察者模式: 开关(被观察者)作为的是事件的产生方(产生“on”和“off...下面我们来看一下rxjava中如何异步处理: 在rxjava中有一个Scheduler —调度器,相当于线程控制器用来控制当前代码执行在哪个线程中,目前rxjava中内置了三种Scheduler:...()被激活的线程(事件产生),observableOn():指定Subscriber执行的线程,即事件消费的线程;光说不练假把式: Observable.just("1","2","3") .subscribeOn...(Schedulers.io())//指定subscribe()执行的线程为io线程 .observeOn(AndroidSchedulers.mainThread())//指定Subscriber回调执行线程为主线程

67120

RxJava2.X 源码分析(五):论切换线程次数的有效性

作者博客 http://www.cherylgood.cn 前言 之前写了四篇从Demo到源码、从表现到内部实现原理,通过源码的分析初步学习了RxJava2.X的一些基本操作及原理,有如下几点 1、Observable...及如何控制Disposable来取消订阅事件 4、分两篇分析了RxJava2.X切换订阅线程和观察者线程的源码 接下来我们将根据之前的分析成果从设计上分析RxJava2.X多次切换线程的有效性 具体分析...切换订阅事件线程的有效性 在RxJava2.X 源码分析(三):探索RxJava2之订阅线程切换原理 中我们分析了订阅线程切换的源码。...订阅事件的传递是从下往上传递,最终传递到上游被订阅者执行订阅流程 假设有三级,每级均发生线程切换: 下游Observer(订阅)->2级Observable(调用) 2级Observer(切换线程1订阅...根据RxJava的调用习惯也就是第一次,所以subscribeOn的调用只有第一次生效 切换观察者线程的有效性 我们在RxJava2.X 源码分析(四)中分析了观察者事件线程切换的源码 订阅数据的数据流是从上而下下发的

42410

RxJava 线程调度和源码阅读

RxJava 内置了几个 Scheduler,通过 Schedulers 来获取。 Schedulers.trampoline():当其它排队的任务完成后,在当前线程排队开始执行,FIFO。...不要把计算工作放在 io() 中,可以避免创建不必要的线程切换线程 subscribeOn(): 控制事件产生的线程。 observeOn(): 控制事件消费的线程。...-1 接收数据 a 如果 observeOn(Schedulers.trampoline()),意思是在当前线程,由于发射时将线程切换到 io 上去了,所以接收时也在这个 io 线程上,日志显示: 发射线程...RxCachedThreadScheduler-1 接收线程 RxCachedThreadScheduler-1 接收数据 a 多次切换接收线程 Observable.create(ObservableOnSubscribe...super T> observer) { // 如果是 TrampolineScheduler,在当前线程执行,不涉及任何线程切换,所以直接调 source.subscribe if

1.6K30

RxJava2--多线程调度Scheduler

Scheduler背景 前面介绍过RxJava的基本概念与使用,可以通过RxJava发射事件,而通过Observer来接收事件。...然而我们大多数时候,会有耗时的操作,比如在子线程完成复杂的矩阵运算,文件的IO操作,网络请求,数据库读写等等,我们希望可以在子线程完成这些事情,而在主线程接收回调事件。...Scheduler家族 所使用的Scheduler主要在Schedulers这个类中,RxJava仅仅提供了以下这些调度器: Schedulers.SINGLE Schedulers.COMPUTATION...,CoreSize为1,在此调度器接收到任务后,先检查线程缓存池中,是否有空闲的线程,如果有,则复用,如果没有则创建新的线程,并加入到线程池中,如果每次都没有空闲线程使用,可以无上限的创建新线程。...Schedulers.newThread( ): 在每执行一个任务时创建一个新的线程,不具有线程缓存机制,因为创建一个新的线程比复用一个线程更耗时耗力,虽然使用Schedulers.io( )的地方,

1.8K40

浅析 RxJava 2.x 线程调度

RxJava 的大名不需要多做介绍,我自己也在项目中使用RxJava也有一段时间了,抱着学习的心态,一直想更深入一点的去了解它的实现原理,当然RxJava东西还是蛮多的,不可能一篇文章就能说清楚,so...,这肯定是一个系列,在这一篇,我先尝试从 RxJava线程控制 来切入,管中窥豹吧,我尽力,看官们随意。...()) 设置数据在主线程被监听,使用没问题,接下来我们来一步步探索实现原理。...Observable subscribe实现.png 线程调度 核心问题就2个,数据的发射的调用在哪个线程, 数据的监听在哪个线程,Scheduler 就是 干这个的(基本原理 就是工作线程的话就是 起线程池来处理任务...drawable) throws Exception { //TODO imageView.setImageDrawable(drawable); }}); 根据我们上面总结的线程切换规则

48510

扫码

添加站长 进交流群

领取专属 10元无门槛券

手把手带您无忧上云

扫码加入开发者社群

相关资讯

热门标签

活动推荐

    运营活动

    活动名称
    广告关闭
    领券