1.背压的产生

Backpressure(背压)是指在异步场景中,被观察者发送事件速度远快于观察者的处理速度的情况下,一种告诉上游的被观察者降低发送速度的策略。在 Observable/Observer 组合的使用中是不支持背压的,下面通过一个例子来看一下这种场景:

Observable.create(new ObservableOnSubscribe<Integer>() {@Overridepublic void subscribe(@NonNull ObservableEmitter<Integer> e) throws Exception {int i = 0;while(i < Long.MAX_VALUE){e.onNext(i);i++;}}}).subscribeOn(Schedulers.newThread()).observeOn(Schedulers.newThread()).subscribe(new Consumer<Integer>() {@Overridepublic void accept(Integer integer) throws Exception {Thread.sleep(1000);Log.e("Test","i = "+integer);}});

2.Flowable

Flowable 就是为了解决背压问题的产物,因此才会把它们和 Observable/Observer 区分开来使用。
由于基于Flowable发射的数据流,以及对数据加工处理的各操作符都添加了背压支持,附加了额外的逻辑,其运行效率要比 Observable 低得多。
因为只有上下游运行在各自的线程中,且上游发射数据速度大于下游接收处理数据的速度时,才会产生背压问题。
所以,如果能够确定上下游在同一个线程中工作,或者上下游工作在不同的线程中,而下游处理数据的速度高于上游发射数据的速度,则不会产生背压问题,就没有必要使用 Flowable,以免影响性能。

Flowable.create(new FlowableOnSubscribe<Integer>() {@Overridepublic void subscribe(@NonNull FlowableEmitter<Integer> e) throws Exception {int i = 0;while(i < Long.MAX_VALUE){e.onNext(i);i++;}}
}, BackpressureStrategy.DROP).subscribeOn(Schedulers.io()).observeOn(Schedulers.newThread()).subscribe(new Subscriber<Integer>() {@Overridepublic void onSubscribe(Subscription s) {s.request(Long.MAX_VALUE);}@Overridepublic void onNext(Integer integer) {try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}Log.e("Test","i = "+integer);}@Overridepublic void onError(Throwable t) {}@Overridepublic void onComplete() {}});

这里注意三点:

  • Flowable.create 参数中多了个 BackpressureStrategy。
  • onSubscribe 回调的参数不是 Disposable 而是 Subscription。而且需要调用 Subscription.request 发起数据请求,否则Subscriber不会接受数据。
  • 数据发射器是 FlowableEmitter 而不是 ObservableEmitter。

3.背压策略(BackpressureStrategy)

Flowable 的异步缓存池不同于 Observable,Observable的异步缓存池没有大小限制,可以无限制向里添加数据,直至OOM,而 Flowable 的异步缓存池有个固定容量,其大小为128。
BackpressureStrategy 的作用便是用来设置 Flowable 异步缓存池中的存储数据超限时的策略。
BackpressureStrategy 提供了一下几种背压策略:

  • MISSING:这种策略模式下相当于没有指定任何的背压策略,不会对数据做缓存或丢弃处理,需要下游通过背压操作符(onBackpressureBuffer()/onBackpressureDrop()/onBackpressureLatest())指定背压策略。
  • ERROR:这种策略模式下如果缓存池中的数据超限了,则会抛出 MissingBackpressureException 异常
  • BUFFER:这种策略模式下没有为异步缓存池限制大小,可以无限制向里添加数据,不会抛出 MissingBackpressureException 异常,但会导致OOM。
  • DROP:这种策略模式下如果异步缓存池满了,会丢掉将要放入缓存池中的数据。
  • LATEST:这种策略模式下与 Drop 策略一样,如果缓存池满了,会丢掉将要放入缓存池中的数据,不同的是,不管缓存池的状态如何,LATEST都会将最后一条数据强行放入缓存池中。

参考:https://www.heqiangfly.com/2017/10/14/open-source-rxjava-guide-flowable/

7.2 Flowable 背压相关推荐

  1. flowable背压 取消_使用Flowable.generate()生成可感知背压的流– RxJava常见问题解答...

    flowable背压 取消 RxJava缺少创建无限自然数流的工厂. 这样的流很有用,例如,当您想通过压缩两个事件的顺序来为可能的无限事件流分配唯一的序列号时: Flowable<Long> ...

  2. 使用Flowable.generate()生成可感知背压的流– RxJava常见问题解答

    RxJava缺少创建无限自然数流的工厂. 这样的流很有用,例如,当您想通过压缩两个事件的唯一序列号给可能的无限事件流时: Flowable<Long> naturalNumbers = / ...

  3. rxjava背压_Android Rxjava :最简单全面背压讲解 (Flowable)

    1.前言 阅读本文需要对Rxjava了解,如果还没有了解或者使用过Rxjava的兄die们,可以观看我另外一篇 Android Rxjava:不一样的诠释进行学习. Rxjava背压:被观察者发送事件 ...

  4. 如何形象地描述 RxJava 中的背压和流控机制?

    之前我在知乎上受邀回答过一个关于RxJava背压(Backpressure)机制的问题,今天我把它整理出来,希望对更多的人能有帮助. RxJava的官方文档中对于背压(Backpressure)机制比 ...

  5. Android RxJava 2.0中backpressure(背压)概念的理解

    英文原文:https://github.com/ReactiveX/RxJava/wiki/Backpressure Backpressure(背压.反压力) 在rxjava中会经常遇到一种情况就是被 ...

  6. rxjava背压_如何形象地描述RxJava中的背压和流控机制?

    之前我在知乎上受邀回答过一个关于RxJava背压(Backpressure)机制的问题,今天我把它整理出来,希望对更多的人能有帮助. RxJava的官方文档中对于背压(Backpressure)机制比 ...

  7. rxjava 背压_背压加载文件– RxJava常见问题解答

    rxjava 背压 事实证明,将文件作为流进行处理非常有效且方便. 许多人似乎忘记了,自Java 8(3年以上!)以来,我们可以很容易地将任何文件变成一行代码: String filePath = & ...

  8. 背压加载文件– RxJava常见问题解答

    事实证明,将文件作为流进行处理非常有效且方便. 许多人似乎忘记了,自Java 8(3年多!)以来,我们可以很容易地将任何文件变成一行代码: String filePath = "foobar ...

  9. RxJava之背压策略

    转载请以链接形式标明出处: 本文出自:103style的博客 本文基于 RxJava 2.x 版本 目录 RxJava背压策略简介 Observable背压导致崩溃的原因 Flowable 使用介绍 ...

  10. RxJava 2.0中backpressure(背压)概念的理解

    英文原文:https://github.com/ReactiveX/RxJava/wiki/Backpressure Backpressure(背压.反压力) 在rxjava中会经常遇到一种情况就是被 ...

最新文章

  1. golang中的测试命令
  2. mysql 表结构关系_mysql 表关系 与 修改表结构
  3. ubyntu 链接mysql_ubuntu mysql 的安装、配置、简单使用,navicat 连接
  4. swing和MySQL登录注册_JavaSwing+Mysql实现简单的登录界面+用户是否存在验证
  5. 34tomcat设置默认页面
  6. java变量数据类型_java变量与数据类型
  7. 微信小程序开发---小程序框架---小程序的逻辑层---3
  8. Dev TreeList常用用法
  9. QT4升级QT5调研报告
  10. 利用elasticsearch实现搜索引擎
  11. 60.(leaflet之家)leaflet虚线
  12. Android的权限声明
  13. 【区块链】虚拟货币钱包
  14. 新茶饮加速“去泡沫”
  15. mysql 联表查询 简书_mysql多表查询
  16. Android 怎么防止多并发请求?比如说一个页面需要请求多个接口,可以跟后台网络交互能做哪些性能优化
  17. 股指期货交易流程(股指期货交易规则详解)
  18. android助手最新版,你的手机助手app下载
  19. 国产麒麟命令更新软件
  20. Android知识点归纳总结

热门文章

  1. 案例分享 | 腾讯互娱基于 CPU 环境的分布式 YOLOv3 实现
  2. greenplum如何删除segment节点
  3. 软件测试是什么工作状态,软件测试,现在主要的工作内容是干什么?
  4. 忍者安全渗透系统(NINJITSU OS V3)的安装详细过程,亲测新旧vm版本都可安装,附带下载来源
  5. 华为云ManageOne北向对接之基本名词概念(一)
  6. 【微信公众号】6、SpringBoot整合WxJava创建自定义菜单
  7. python - 正则表达式 与或非
  8. 华中科技大学计算机免试,华中科技大学计算机学院2015年接收推荐免试研究生待录取结果公示...
  9. LeetCode | 347. Top K Frequent Elements
  10. 【已解决】打开游戏或者游戏引擎耳机出现滋滋滋的电流声