RxJava开发精要1-从.NET到RxJava

RX - 从.NET到RxJava

响应式编程是一种基于异步数据流概念的编程模式。数据流就像一条河:它能够被观測,被过滤,被操作。或者为新的消费者与另外一条流合并为一条新的流。

响应式编程的一个关键概念是事件。事件能够被等待。能够触发过程。也能够触发其它事件。事件是唯一的以合适的方式将我们的现实世界映射到我们的软件中:假设屋里太热了我们就打开一扇窗户。相同的。当我们更改电子表(变化的传播)中的一些数值时,我们须要更新整个表格或者我们的机器人碰到墙时会转弯(响应事件)。

今天,响应式编程最通用的一个场景是UI:我们的移动App必须做出对网络调用、用户触摸输入和系统弹框的响应。在这个世界上,软件之所以是事件驱动并响应的是由于现实生活也是如此。

微软响应式扩展

函数响应式编程是一个来自90年代后期受微软的一名计算机科学家Erik Meijer启示的思想。用来设计和开发微软的Rx库。

Rx 是微软.NET的一个响应式扩展。

Rx借助可观測的序列提供一种简单的方式来创建异步的,基于事件驱动的程序。开发人员能够使用Observables模拟异步数据流,使用LINQ语法查询Observables。而且非常easy管理调度器的并发。

Rx让众所周知的概念变得易于实现和消费,比如push方法。在响应式的世界里。我们不能假装作用户不关注或者是不抱怨它而一味的等待函数的返回结果,网络调用,或者数据库查询的返回结果。

我们时刻都在等待某些东西,这就让我们失去了并行处理其它事情的机会,提供更好的用户体验,让我们的软件免受顺序链的影响,而堵塞编程。

下表列出的与.NET 枚举相关的.NET Observable

.NET Observable 一个返回值 多个返回值
Pull/Synchronous/Interactive T IEnumerable<T>
Push/Asynchronous/Reactive Task<T> IObservable<T>

push方法把这个问题逆转了:取而代之的是不再等待结果,开发人员仅仅是简单的请求结果,而当它返回时得到一个通知就可以。开发人员对即将发生的事件提供一个清晰的响应链。对于每个事件,开发人员都作出对应的响应;比如。用户被要求登录的时候,提交一个携带他的username和password的表单。应用程序运行登录的网络请求,接下来将要发生的情况有:

  • 显示一个成功的信息,并保存用户的个人信息。
  • 显示一个错误的信息

正如你用push方法所示。开发人员不须要等待结果。而是在结果返回时通知他。在这期间,他能够做他想做的不论什么事情:

  • 显示一个进度对话框
  • 为下次登录保存username和password
  • 预载入一些他觉得登录成功后须要耗时处理的事情

来到Java世界 - Netflix RxJava

Netflix在2012年開始意识到他们的架构要满足他们庞大的用户群体已经变得步履维艰。因此他们决定又一次设计架构来降低REST调用的次数。

代替几十次的REST调用。而是让client自己处理须要的数据。他们决定基于client需求创建一个专门优化过的REST调用。

为了实现这一目标。他们决定尝试响应式,開始将.NET Rx迁移到JVM上面。他们不想仅仅基于Java语言。而是整个JVM。从而有可能为市场上的每一种基于JVM的语言:如Java、Closure、Groovy、Scala等等提供一种新的工具。

2013年二月份,Ben Christensen 和 Jafar Husain发在Netflix技术博客的一篇文章第一次向世界展示了RxJava。

主要特点有:

  • 易于并发从而更好的利用server的能力。
  • 易于有条件的异步运行。
  • 一种更好的方式来避免回调地狱。
  • 一种响应式方法。

正如.NET,RxJava Observable 是push 迭代的等价体。即pull。pull方法是堵塞并等待的方法:消费者从源头pull值。并堵塞线程直到生产者提供新的值。

push方法作用于订阅和响应:消费者订阅新值的发射,当它们可用时生产者push这些新值并通知消费者。在这一点上,消费者消费了它们。push方法非常明显更灵活。由于从逻辑和实践的观点来看,开发人员仅仅需忽略他须要的数据是来自同步还是异步;他的代码将仍然起作用。

RxJava的与众不同之处

从纯Java的观点看,RxJava Observable类源自于经典的Gang Of Four的观察者模式。

它加入了三个缺少的功能:

  • 生产者在没有很多其它数据可用时能够发出信号通知:onCompleted()事件。
  • 生产者在错误发生时能够发出信号通知:onError()事件。
  • RxJava Observables 能够组合而不是嵌套,从而避免开发人员陷入回调地狱。

Observables和Iterables共用一个类似的API:我们在Iterable能够运行的很多操作也都相同能够在Observables上运行。当然,由于Observables流的本质。没有如Iterable.remove()这样对应的方法。

Pattern 一个返回值 多个返回值
Synchronous T getData() Iterable<T>
Asynchronous Future<T> getData() Observable<T> getData()

从语义的角度来看。RxJava就是.NET Rx。从语法的角度来看,Netflix考虑到了对应每个Rx方法,保留了Java代码规范和主要的模式。

总结

本章中,我们初步探索了响应式的世界。从微软的.NET到Netflix的RxJava。我们了解了Rx是怎样诞生的,我们也了解到传统的方法与响应式方法相比之间的类似和不同。

下一章。我们将学习到Observables是什么,以及怎样创建它并把响应式编程应用到我们的日常编码中去。

原文地址:https://www.cnblogs.com/liguangsunls/p/7091228.html