Observable 相对于 Flowable 的实际优势是什么?

What are the actual advantages of Observable over Flowable?

What's different in 2.0描述了ObservableFlowable之间的区别。但是,Observable 主要是根据它与 Flowable 相比所缺少的功能来描述的。 Observable只提到了一个显着特征:

Using Observable has lower overhead in general than Flowable.

但这似乎与 Observable 对于少量元素更可取并且如果任务太重则更有可能导致 OutOfMemoryError 的建议相矛盾。这似乎表明 Flowable 通常更有效率。

另一件让我感到困惑的事情是,如果 Observable 是元素少于 1K 的用例的首选,而 Flowable 是元素超过 10K 的用例的首选,那么用例有1K 和 10K 之间的元素是灰色区域。

是否有关于 ObservableFlowable 之间差异的更技术性的解释? 特别是建议一种实用的启发式方法来决定在1K 和 10K 元素之间的灰色区域,或者当元素数量未知或可能发生变化时。

相关:仅引用文档,不作进一步解释。

Is there a more technical explanation of the differences between Observable and Flowable?

我会给你一个,但大多数人都被技术细节吓到了。

However, Observable is mostly described in terms of features that it lacks in comparison to Flowable.

是的,因为从技术上讲 ObservableFlowable 减去所有运算符上与背压相关的请求协调逻辑。

But even this seems to be contradicted by the suggestion ...

没有矛盾,通过 Observable 从一端到另一端获取值遇到较少 "resistance" 因为逻辑不必处理请求协调或临时缓冲。例如,Observable.flatMapIterable 不必对源项进行排队,因为每个内部 Iterable 都可以立即从 onNext 中完整流式传输。 Flowable 必须排队项目,蹦床排空和可迭代项目排放,并在与直接排放相比相当昂贵的队列排放逻辑中将其限制在请求的数量。

This seems to suggest that Flowable is generally more efficient.

内存使用(因此 GC 开销)和延迟之间存在权衡。

Then use cases having between 1K and 10K elements are a gray area.

这意味着在这两个数字之间,您可能需要找到其他决策变量,例如单个元素大小、预期延迟、您 app/system 的其余部分在做什么等。

or when the number of elements is unknown or may change

Observable 的情况使用单词 "longest",这意味着在任何给定时间,您可能有 1000 个或更少元素的缓冲序列,或者您的源最多发出 1平均每毫秒元素。

这是一个典型的 "depends" 案例:

  • 来源能否合理背压?
  • 处理逻辑通常比源或其上层慢吗?
  • 不同的订阅者会遇到不同数量的元素吗?
  • 环境是否以某种方式受到限制?
  • 物品比较大吗?

如果您对这些问题的回答是肯定的,那么您最好选择 Flowable

ObservableFlowable 非常相似。 Flowable 较新,通常更高级:

Observable 仍然存在的原因是与原始 Microsoft 的 ReactiveX 框架在概念上的兼容性。记住 RxJava 是 ReactiveX project.

的一部分

在大多数(甚至所有)情况下,我建议 Flowable 而不是 Observable。除非您正在从事 Java 部分不占主导地位的多语言项目。