Observable 与 Flowable rxJava2

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (17)

我一直在寻找新的rx java 2,我不太确定我是否理解了这个想法backpressure......

我知道我们Observable没有backpressure支持,Flowable而且有它。

因此,基于例如,可以说我有flowableinterval

        Flowable.interval(1, TimeUnit.MILLISECONDS, Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Consumer<Long>() {
                @Override
                public void accept(Long aLong) throws Exception {
                    // do smth
                }
            });

这会在大约128个值后崩溃,这很明显,我比获取项目消耗得慢。

但是,我们也一样 Observable

     Observable.interval(1, TimeUnit.MILLISECONDS, Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Consumer<Long>() {
                @Override
                public void accept(Long aLong) throws Exception {
                    // do smth
                }
            });

即使我在延迟使用它时仍然有效,它也不会崩溃。让Flowable工作让我说我把onBackpressureDrop运营商,崩溃消失,但并不是所有的价值都发出。

因此,我目前在我脑海中找不到答案的基本问题是为什么我应该在乎我什么backpressure时候可以使用plain Observable仍然可以接收所有值而不管理buffer?或者从另一方面来看backpressure,有利于管理和处理消费的是什么优势?

提问于
用户回答回答于

在实践中,背压表现为有界的缓冲区,Flowable.observeOn有128个元素的缓冲区,尽可能快地被下游流所吸收。您可以单独增加缓冲区大小来处理突发源,所有背压管理实践仍然适用于1.x. Observable.observeOn有一个无限制的缓冲区,不断收集元素,并且您的应用程序可能会耗尽内存。

您可以使用Observable例如:

  • 处理GUI事件
  • 使用短序列(总共少于1000个元素)

您可以使用Flowable例如:

  • 冷和非定时来源
  • 发电机像来源
  • 网络和数据库访问器
用户回答回答于

背压是指当你的可观察者(出版商)创造的事件多于你的订阅者可以处理的事件时。因此,您可以让订阅者丢失事件,或者您可能会遇到大量导致内存不足的事件。 Flowable考虑背压。 Observable才不是。而已。

它提醒了一个漏斗,当液体溢出太多时。流动可以帮助不会发生这种情况:

背压巨大:

但使用可流动的,背压要低得多:

扫码关注云+社区