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

RxJava 容易忽视的细节: subscribeOn() 方法没有按照预期地运行

被观察者多次调用 subscribeOn() 之后,并不意味着线程只会切换一次,而是线程多次切换之后,最终切换到第一次设置的线程。 所以, subscribeOn() 方法的调用并非一直有效。...通常情况下,RxJava 发射的数据会在同一个线程上,但是稍作一些变化,发射的数据来自不同的线程会怎样呢?...此时 RxJava 没有改变线程,是因为 subscribeOn() 方法已经完成了工作,订阅已经在其他线程上进行了。这时,没有理由 RxJava 会再次更改线程。所以,会看到上述的运行结果。 二....Subject 并不是线程安全的,如果想要其线程安全需要调用toSerialized()方法。...总结 RxJava 用好不易,很多东西需要深究其源码。 本文介绍了几种方式,RxJava 即使调用了 subscribeOn() 方法,线程切换也不会起作用。

1.9K10

RxJava 的 Subject

因为BehaviorSubject 每次只会发射调用subscribe()方法之前的最后一个事件和调用subscribe()方法之后的事件。...但是从并发的角度来看,ReplaySubject 在处理并发 subscribe() 和 onNext() 时会更加复杂。 ReplaySubject除了可以限制缓存数据的数量和还能限制缓存的时间。...,都发射全部数据 PublishSubject 发送订阅之后全部数据 可能错过的事件 Subject 作为一个Observable时,可以不停地调用onNext()来发送事件,直到遇到onComplete...所以,我们使用PublishSubject,考虑到多线程的情况,还需要使用 Subject 的 toSerialized() 方法。...总结 RxJava 的 Subject 是一种特殊的存在,它的灵活性在使用时也会伴随着风险,没有用好它的话会错过事件,并且使用时还要小心 Subject 不是线程安全的。

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

    RxJava && Agera 从源码简要分析基本调用流程(2)

    作者:晋中望 接上篇RxJava && Agera 从源码简要分析基本调用流程(1)我们从"1.订阅过程"、“2.变换过程”进行分析,下篇文章我们继续分析"3.线程切换过程" 3.线程切换过程 从上文中我们知道了...对于我们而言,最常见的莫过于在非主线程获取并处理数据之后在主线程更新UI这样的场景了: [image.jpg] 这是我们十分常见的调用方法,一气呵成就把不同线程之间的处理都搞定了,因为是链式所以结构也很清晰...前面配置完成后,数据流RFlow生成,之后通过getFrom()、mergeIn()、transform()等方法可进一步进行流式调用;也可以使用attemptXXX()方法代替原方法,后面接着调用orSkip...此时,我们可以在结束前按需要选择对数据流进行最后的配置,例如:调用onDeactivation()配置从“订阅”到“取消订阅”的过程是否需要继续执行数据流等等。...可以看到,除了 Push event, pull data 这一特点、goLazy的加载模式(本文未介绍)等,依托于较为精简的方法,Agera的流式调用过程同样也能够做到过程清晰,并且上手难度相较于RxJava

    10.4K10

    Carson带你学Android:RxJava2.0到底更新了什么?

    前言 Rxjava由于其基于事件流的链式调用、逻辑简洁 & 使用简单的特点,深受各大 Android开发者的欢迎。...今天,我将为大家带来 RxJava 2.0 相对于RxJava 1.0 的升级总结 & 从RxJava 1.0升级到RxJava 2.0需要注意的坑,希望大家会喜欢 Carson带你学RxJava系列文章...简化订阅方法 对于简化订阅的方式, RxJava 1 主要采用 ActionX接口 & FuncX接口 在 RxJava 2 中,主要是对这一系列接口的名字 按照Java8的命名规则 进行了修改,而使用方法不变...这意味着,在这些方法里调用会发生异常的方法不需要try-catch // 2....使用建议 对于学习 & 在项目中使用RxJava的版本选择,我给出以下建议: 8. 总结 本文主要讲解了RxJava 2.0相对于 RxJava 1.0的变动

    47110

    Android :RxJava2.0到底更新了什么?(含使用建议)

    前言 Rxjava由于其基于事件流的链式调用、逻辑简洁 & 使用简单的特点,深受各大 Android开发者的欢迎。 ?...,所以假如你在使用RxJava 1.0需要升级到RxJava 2.0,则需要做一些转变 今天,我将为大家带来 RxJava 2.0 相对于RxJava 1.0 的升级总结 & 从RxJava 1.0升级到...这意味着,在这些方法里调用会发生异常的方法不需要try-catch // 2....总结 本文主要讲解了RxJava 2.0相对于 RxJava 1.0的变动 从上面可以看到,RxJava 2.0相对于 RxJava 1.0最大的改动,主要是增加了被观察者的新实现:Flowable...中 Rxjava 2.0 的一系列文章,包括原理、操作符、应用场景、背压等等 ,有兴趣可以继续关注Carson_Ho的安卓开发笔记!!

    1K30

    干货| 是时候对RxLifecycle来篇详解了

    随着Android第三库的普及,RxJava和RxAndroid 越来越被人熟知,简洁的语法,配合Java8 Lambda表达式,使代码的结构更加清晰,通过线程调度器更容易控制和切换线程,种种优点,使用它的人也越来越多...compile 'io.reactivex:rxjava:1.2.6' Components包中包含RxActivity、RxFragment等等,可以用Rxlifecycle提供的,也可以自定义...,因为是在onStart的时候调用,所以在onStop的时候自动取消订阅 .compose(this....为了实现这个功能,可以联想到RxJava中的Subject,既能够发射数据,又能够接收数据。 SubJect介绍 了解Subject的读者可以跳过这部分。 如何理解Subject呢?...对于Fragment中的处理方法也是类似。下期不定时的再来对RxLifeCycle的综合原理做介绍,喜欢的朋友可以来点打赏,鼓励作者出更多好文。

    1.6K20

    RxJava系列二(基本概念及使用介绍)

    关于观察者模式的详细介绍可以参考我之前的文章:设计模式之观察者模式 扩展的观察者模式 在RxJava中主要有4个角色: Observable Subject Observer Subscriber Observable...RxJava如何使用 我自己在学习一种新技术的时候通常喜欢先去了解它是怎么用的,掌握了使用方法后再去深挖其原理。那么我们现在就来说说RxJava到底该怎么用。...而在RxJava中的观察者Observer提供了:onNext()、 onCompleted()和onError()三个方法。还记得吗?...ps:onNext就相当于普通观察者模式中的update RxJava中添加了普通观察者模式缺失的三个功能: RxJava中规定当不再有新的事件发出时,可以调用onCompleted()方法作为标示;...异步 上一篇文章中开篇就讲到RxJava就是来处理异步任务的。但是默认情况下我们在哪个线程调用subscribe()就在哪个线程生产事件,在哪个线程生产事件就在哪个线程消费事件。那怎么做到异步呢?

    971100

    【Dev Club分享】基于RxJava的一种MVP实现

    通过接口通信 实现与接口分离实现,不同场景(正式,测试)挂载不同的实现,方便测试写假数据 所有的业务逻辑都在非UI线程中进行,最大限度减少IO操作对UI的影响 使用RxJava可以将复杂的调用进行链式组合...实际项目应用,我个人倾向于第一种,这种无论是开发过程,还是排查问题都会方便很多。当然,不同的项目还是有不同的分法的,不一而论。 Q2:耗时操作可能引起的内存泄露问题,请问是如何处理的。...另外如何界定展现方法在哪调用?比如页面需要显示一个标题,内容是从之前页面传过来的,那是在activity接收后就直接显示?还是先传递到p层再回调activity的显示方法?...感谢 价值在于,把presenter 与activity解耦之后,我可以在别的activity使用这个presenter层逻辑,也可以在这个activity 里调用其它页面的presenter方法。...我猜你想问的问题可能是:一个接口的请求依赖另一个API请求返回的数据,这就是嵌套回调问题。可以找下大头鬼Bruce的一篇文章,《RxJava使用场景小结》,里面有介绍的,这里不详细讨论了。

    97070

    Android 中 RxJava 的使用

    前言 Android原生的多线程和异步处理简直糟透了,反复的嵌套让代码看起来十分不明了,多线程上也没有iOS的dispatch好用,但是用了Rxjava后就会有所改善,虽然代码量看起来会多一点,但是逻辑就清晰多了...本文代码对应的是Rxjava2 真前言 总的来说Rxjava可以分为5块内容 分别为 发布者(Observable/Flowable/Single/Completable) 订阅者(Subscriber...RxJava 不仅把每个事件单独处理,还会把它们看做一个队列。RxJava 规定,当不会再有新的 onNext() 发出时,需要触发 onCompleted() 方法作为标志。...的性能较高 Single: 和Observable,Flowable一样会发送数据,不同的是订阅后只能接受到一次 普通Observable可以使用toSingle转换:Observable.just...(1).toCompletable() 发布者发布事件 可以手动创建也可以调用内置方法 Observable Observable .create(new ObservableOnSubscribe

    2.2K30

    RxJava 详解

    前言 我从去年开始使用 RxJava ,到现在一年多了。今年加入了 Flipboard 后,看到 Flipboard 的 Android 项目也在使用 RxJava ,并且使用的场景越来越多 。...而且subscribe()不是最外层直接调用的方法吗,它竟然也能被指定线程?)。然而 Scheduler 的原理需要放在后面讲,因为它的原理是以下一节《变换》的原理作为基础的。...如上,通过observeOn()的多次调用,程序实现了线程的多次切换。 不过,不同于observeOn(),subscribeOn()的位置放在哪里都可以,但它是只能调用一次的。...又有好事的(其实还是当初的我)问了:如果我非要调用多次subscribeOn()呢?会有什么效果? 这个问题先放着,我们还是从 RxJava 线程控制的原理说起吧。...从图中可以看出,subscribeOn()和observeOn()都做了线程切换的工作(图中的 "schedule..." 部位)。

    1.8K10

    Android大厂面试经验分享(OPPO,字节,华为,阿里)

    JVM类加载过程 1.17 JVM内存结构 JVM内存结构【方法区+虚拟机栈+本地方法栈+程序计数器+堆】 Java中的对象一定在堆上分配吗?...()的原理吗?...简单介绍一下 同步请求详细源码解读 异步请求详细源码解读 okhttp实现网络请求的方法 okhttp实现带进度上传下载 为什么response.body().string() 只能调用一次 okhttp...(五) RxJava操作符之组合操作符(六) 7.20 RxJava原理与源码分析 RxJava的消息订阅和线程切换原理 7.21 RxJava如何进行线程切换的?...RxJava 是如何实现线程切换的(上) RxJava 线程切换原理 RxJava2线程切换原理分析 7.22 Rxjava内存泄漏防止方案——RxLifecycle,AutoDispose,RxLife

    1.3K60

    Retrofit分析- 架构师是怎么炼成的

    比如RxJava会根据调用方法的返回值,如Response |Result|Observable ,生成不同的CallAdapter。实际上就是对RxJava的回调方式做封装。...(这块还是需要在了解RxJava的基础上去理解,以后有时间可以再详细做分析) 在步骤5中,我们说CallAdapter还管理线程。...比方说RxJava,我们知道,它最大的优点可以指定方法在什么线程下执行。如图 retrofit04.png 我们在子线程订阅(subscribeOn),在主线程观察(observeOn)。...在adapt Call中,具体的调用了Call execute(),execute()是同步的,enqueue()是异步的。因为RxJava已经切换了线程,所以这里用同步方法execute()。...在Service方法上声明泛型具体类型就可以了。 最后,通过声明的observeOn线程回调给上层。这样上层就拿到了最终结果。至于结果再如何处理,那就是上层的事了。

    74120

    一篇博客让你了解RxJava

    RxJava可以说是2016年最流行的项目之一了,最近也接触了一下RxJava,于是想写一篇博客,希望能通过这篇博客让大家能对其进行了解,本篇博客是基于RxJava2.0,跟RxJava1.0还是有很多不同的...也就是调用了subscribe()方法之后才开始发送事件. 上面我们看到观察者和被观察者的逻辑是分开写的,那能不能合在一起写呢?...同时可以看到Observer的onSubscribe()方法是最先调用的. subscribe()有多个重载的方法: public final Disposable subscribe() {} public...通过RxJava内置的线程调度器可以很轻松的做到这一点....,也就是上面subscribe()方法调用的线程 .subscribeOn(Schedulers.io()) // 指定 Observer 回调方法所在的线程,也就是onCompleted

    53020

    Google 推荐在 MVVM 架构中使用 Kotlin Flow

    Flow 相比于 RxJava 简单的太多了,你还记得那些 RxJava 傻傻分不清楚的操作符吗 Observable、 Flowable 、 Single 、 Completable 、 Maybe...,造成内存泄露是很正常的事,大家可以从 StackOverflow 上查看一下,有很多因为 RxJava 造成内存泄露的例子 RxJava 入门的门槛很高,学习过的朋友们,我相信能够体会到从入门到放弃是什么感觉...suspend 进行了修饰,只有被 suspend 修饰的方法,才可以在协程中调用。...,只会接受最新的一次发射过来的数据 调用 _pokemon.postValue 方法将数据提供给 Activity 或者 Fragment 方法二 在 LifeCycle 2.2.0 之后,可以用更精简的方法来完成...,如果使用过 RxJava 的小伙伴们应该会非常熟悉,对于没有使用过 RxJava 的小伙伴们,入门的门槛也是非常低的,强烈建议至少体验一次,体验过之后,我认为你会跟我一样爱上它的。

    4.4K21

    RxJava这么好用却容易内存泄漏?解决办法是...

    一般的做法是订阅成功后,拿到Disposable对象,在Activity/Fragment销毁时,调用Disposable对象的dispose()方法,将异步任务中断,也就是中断RxJava的管道,代码如下...对于这种写法,身患强迫症的我,实在不能接受。也许你们会说,可以使用CompositeDisposable类,就可以避免手写关闭n个异步任务的代码,只需要关闭一次即可。...没毛病,确实可以,然而这种做法也仅仅是避免了我们手写关闭异步任务的代码而已。追求极致的我,也不能接受这种写法,此时我就想,能不能就用一行代码解决这个问题呢?...到onDetachedFromWindow;ViewModel的作用域就是从构造方法到onCleared方法;其它任意类的作用域就是从创建到销毁,当然,你也可以自己指定一些类的作用域。...Activity/Fragment销毁使,调用CompositeDisposable对象的dispose方法,统一中断RxJava管道,从而达到目的。

    4.7K20
    领券