Advanced RxJava

NEVER STOP

响应式编程库 Scrabble 基准测试

原文 The Reactive Scrabble benchmarks。 介绍 过去一年多的时间里,我以神秘的莎士比亚 Scrabble 之名发布了很多基准测试结果。在本文中,我将解释这个基准测试是什么、从何而来、如何运作、有何目的,以及如何在未测试的库上面运行这一基准测试。 历史 这一基准测试由 Jose Paumard 设计开发,测试结果首次于他的 2015 Devoxx 演讲上...

Async Iterable/Enumerable vs. Reactive-Streams

原文 Async Iterable/Enumerable vs. Reactive-Streams。 介绍 在响应式数据处理流水线中,当两个部分处理数据速度不同时,如果我们不希望缓冲区爆炸或者内存耗尽,那 backpressure 就至关重要了。RxJava 和 Reactive-Streams 设计了一套非阻塞、基于请求协调的处理机制,但可能我们也听说过其他的解决方案。一个经常被提及的...

Google Agera vs. ReactiveX

原文 Google Agera vs. ReactiveX。 介绍 如果大家一直关注安卓开发圈内的事件,或者关注响应式编程相关的事件,那就知道最近 Google 搞了一件“大事情”:他们发布了专门针对安卓平台的响应式编程库 Agera。(译者注:其实 Agera 是一年前的事了,不过一年过去了,Agera 好像没什么动静了)当然,我们需要仔细深入细节,才能准确了解 Agera 是怎么回事...

操作符熔合(二)

原文 Operator-fusion (part 2 - final)。 介绍 在上篇中,我介绍了操作符熔合的一些相关概念。在本文中,我将详细讲解实现操作符熔合的 API 和协议。 当前的操作符熔合都只适用于相邻的两个操作符,且基于双方都能互相知晓对方类型的前提,而在微熔合中,如果双方都同意新的协议,那将忽略 Reactive-Streams(RS) 规范而是用新的协议。 宏熔合的结...

如何编写自定义响应式基础类型

原文 Writing a custom reactive base type。 介绍 一直以来,大家都在问如何实现自己的响应式类型。尽管 RxJava 的 Observable 有大量方法,也允许通过 lift()、extend() 以及 compose() 进行扩展,大家仍会希望 Observable 拥有某个 xyz() 操作符,或者在某个调用链中不允许调用 uvw()。 第一个情...

操作符熔合(一)

原文 Operator-fusion (Part 1)。 介绍 操作符熔合是响应式编程领域最尖端的研究话题之一,它的目的是把数据流中使用的多个操作符以某种方式结合起来,进而降低开销(时间,内存)。 (其他尖端的话题包括:1. 响应式 IO;2. 更多原生的异步并行序列;3. 透明远程查询(transparent remote reactive queries)。) 操作符熔合最关键的...

RxJava 设计回顾

原文 RxJava design retrospect。 介绍 RxJava 已经发布三年多了,期间也经历了好几次重大的版本变化。在本文中,我将指出一些我个人认为设计和实现过程中的不足之处。 但不要误会,这并不是说 RxJava 不好,或者我知道怎么做得“更好”。这对所有参与其中的人来说都是一个学习的过程,关键是,我们能否从这些问题中吸取教训,在下一个大版本中做得更好。 同步取消订阅...

FlatMap 技术揭秘(二)

原文 FlatMap (part 2)。 介绍 在本文中,我们将会丰富我们 flatMap 实现的功能,并提升它的性能。 RxJava 的 flatMap 提供了最大并发数限制,也就是最多同时允许订阅到 mapper 产生的 Observable 的数量,还提供了错误延迟功能,允许延迟任何上游产生的错误,包括主上游。 并发限制 由于历史原因,RxJava 的 flatMap(以及我...

FlatMap 技术揭秘(一)

原文 FlatMap (part 1)。 介绍 在本文中,我将开始对使用最广泛、误解也最多同时也是最复杂的操作符 flatMap 进行一次里里外外的大揭秘。 flatMap 是迄今为止最有用的操作符,因为它能让我们把简单的输入事件转换为任何我们想要的事件,我们可以控制时间、位置甚至事件数量。flatMap 被误解是因为诞生太晚,没有足够的时间充分展示它的使用,而且使用它经常伴随着函数式...

全新 Completable API(二)

原文 The new Completable API (part 2)。 介绍 在本文中,我将展示如何实现 Completable 的操作符(包括数据源和转换操作符)。由于 Completable API 并不会发出数据,只有 onError 和 onCompleted 事件,所以它的操作符比 Observable 少得多。 Empty 我们首先实现 empty() 操作符,它会在被...