RxJava反应式编程
上QQ阅读APP看书,第一时间看更新

1.2 何时需要反应式编程

反应式编程在如下场景中非常有用。

• 处理用户事件,比如鼠标移动和单击、键盘输入、GPS信号因用户设备的移动而不断变化、设备陀螺仪信号和触摸事件等。

• 响应和处理来自磁盘或网络的所有延迟受限的IO事件,IO本质上是异步的(发起请求,时间推移,可能收到也可能收不到响应,触发下一步事件)。

• 在应用程序中处理由该应用程序无法控制的生产者推送过来的事件或数据(来自服务器的系统事件、上述用户事件、来自硬件的信号、模拟世界中由传感器触发的事件等)。

如果涉及的代码只处理一个事件流,那么使用带有回调的反应式-命令式编程就很好,引入反应式-函数式编程并不会带来太多的收益。如果你有数百个不同的事件流,而且它们彼此独立,命令式编程也不会有太大的问题。在这种直接的使用场景中,命令式是最高效的方式,因为它消除了反应式编程的抽象层,并且更加契合对当前操作系统、语言和编译器的优化。

如果你的程序像大多数程序一样,那么你需要组合事件(或者函数或网络调用的异步响应)、包含事件交互的条件逻辑,而且在所有调用之后必须处理故障场景和清理资源。在这种情况下,反应式-命令式的复杂性会急剧增加,而反应式-函数式编程则能体现出它的价值了。我认同一个未经科学验证的观点,那就是反应式-函数式编程难入门而且学习曲线较陡峭,但是它的复杂性要远远低于反应式-命令式编程。

这就是称Reactive Extensions(Rx)和RxJava是“用于组合异步和基于事件的程序的库”的原因。RxJava是反应式编程原则的具体实现,受到了函数式以及数据流编程的影响。其实,我们有不同的方式来实现“反应式”, RxJava只是其中之一。接下来深入研究一下它是如何运行的。