RxJava2如何实现链式调用和线程切换

本文详细介绍了RxJava2中的背压处理、链式调用和线程切换原理。讲解了Flowable的背压策略,包括MISSING、BUFFER、ERROR、DROP和LATEST。重点讨论了map、flatMap操作符及其原理,以及lift()方法在变换中的作用。还深入探讨了subscribeOn()和observeOn()的线程切换机制,并解释了为什么subscribeOn()只有第一次切换有效。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

线程切换

背压

背压在计算机系统中指网络拥塞信息逆流通过。在rxjava中理解为:被观察者发送消息太快以至于它的操作符或者订阅者不能及时处理相关的消息,从而操作消息的阻塞现象

在RxJava2.0中官方,推出了Flowable 和Subscriber用来支持背压,同样的去除了Observable对背压的支持,对的就像你上面看到的,Observable不再支持背压了,即使阻塞崩溃也不会抛出MissingBackpressureException

Flowable的用法吧。

Flowable.create(FlowableOnSubscribe<T> source, BackpressureStrategy mode)

FlowableOnSubscribe很好理解就是一个就是Flowable的一个被观察者源,而BackpressureStrategy就是Flowable提供的背压策略

背压策略

  1. MISSING:
    如果流的速度无法保持同步,可能会抛出MissingBackpressureException或IllegalStateException。
  2. BUFFER
    上游不断的发出onNext请求,直到下游处理完,也就是和Observable一样了,缓存池无限大,最后直到程序崩溃
  3. ERROR
    会在下游跟不上速度时抛出MissingBackpressureException。
  4. DROP
    会在下游跟不上速度时把onNext的值丢弃。
  5. LATEST
    会一直保留最新的onNext的值,直到被下游消费掉。
链式调用
变换/操作符
  1. 所谓变换,就是将事件序列中的对象或整个序列进行加工处理,转换成不同的事件或事件序列。比如要修改Observable对象,把字符串改为整型或者加上另一串字符等等。
  2. 操作符就是为了解决对Observable对象的变换的问题,操作符用于在Observable和最终的Subscriber之间修改Observable发出的事件。
  3. 变换操作符API
  • from()
    Observable.from()方法,它接收一个集合作为输入,然后每次输出一个元素给subscriber
Observable.from("url1", "url2", "url3")
.subscribe(new Action1<String>() { 
        @Override  
        public void call(String s) { 
            System.out.println(s); 
        }  
    });  
  • map()改变observable对象发出的数据类型
    map操作符有趣的一点是它不必返回Observable对象返回的类型,我们可以使用map操作符返回一个发出新的数据类型的observable对象。
    比如上面的例子中,subscriber如果并不关心返回的字符串,而是想要字符串的hash值,则可以这样写:
Observable.just("Hello, world!")    //输入类型 String
    .map(new Func1<String, Integer>() {  //String ---> Integer
        @Override  
        public Integer call(String s) {  //参数类型 String
            return s.hashCode();        //返回类型 Integer
        }  
    })  
    .subscribe(new Action1<Integer>() {  //由map()返回的Observable对象调用
        @Override  
        public void call(Integer i) {   //参数类型 Integer(即上面的返回类型)
              System.out.println(Integer.toString(i));  
        }  
    });  

这里出现了一个叫做 Func1 的类。它和 Action1 非常相似,也是 RxJava 的一个接口,用于包装含有一个参数的方法。 Func1 和 Action 的区别在于,** Func1 包装的是有返回值的方法**。另外,和 ActionX 一样, FuncX 也有多个,用于不同参数个数的方法。(用于输入与输出参数数据类型的变换)

  • flatMap()
    flatMap() 和 map() 有一个相同点:它也是把传入的参数转化之后返回另一个对象。但需要注意,和 map() 不同的是, flatMap() 中返回的是个 Observable 对象,并且这个 Observable 对象并不是被直接发送到了 Subscriber 的回调方法中map()解决的是一对一的变换,flatMap()解决的是一对多的变换。

flatMap()的原理

  1. 使用传入的事件对象创建一个 Observable 对象;
  2. 并不发送这个 Observable, 而是将它激活,于是它开始发送事件;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Vinson武

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值