响应式编程在以下场景中很有用:
处理用户事件,如鼠标移动和点击,键盘输入,随着用户移动设备,GPS信号随着时间的推移而变化,设备陀螺仪信号,触摸事件,等等。
响应和处理磁盘或网络上的任何和所有延迟绑定的IO事件,因为IO本质上是异步的(请求已经产生,时间也过去了,响应可能会被接收,或者可能不被接收,这可以进一步的触发下面的工作)。
处理无法控制的生产者在应用程序中推送的事件或数据(来自服务器的系统事件,前面提到的用户事件,来自硬件的信号,由模拟世界触发的事件,等等))
现在,如果问题中的代码只处理一个事件流,那么带回调的reactive-imperative(响应式命令)编程将会很好,并且引入reactive-functional编程不会给您带来多大的好处。您可以拥有数百个不同的事件流,如果它们完全独立于彼此,那么命令式编程就不太可能成为问题。在在这种简单的用例中,命令式方法将是最有效的,因为它们消除了响应式编程的抽象层,并且保持与当前操作系统、语言和编译器优化的更紧密的关系。
如果您的程序和大多数程序一样,您需要将事件(或来自函数或网络调用的异步响应)组合在一起,有条件逻辑在它们之间进行交互,并且必须处理所有的失败场景和资源回收。那么在这种情况下,reactive-imperative(响应式命令)编程则并不适合,而reactive-functional(响应式函数)编程则是最优选择。我所接受的一个非科学的观点是,reactive-functional(响应式函数)编程最初有更高的学习曲线和进入壁垒,但复杂性的上限远远低于reactive-imperative(响应式命令)编程。
因此,这就是一般的响应式扩展(Reactive Extensions Rx)和RxJava(RxJava)的标记线,它是“一个用于组合异步和基于事件的程序的库”。RxJava是受函数式和数据流式编程影响的响应式编程原则的具体实现。实现“reactive(响应式)”有很多方法,而RxJava只是其中之一。让我们来研究一下它是如何工作的。