美文网首页RxJava之深入浅出
RxJava之前世今生(一)

RxJava之前世今生(一)

作者: 于阗 | 来源:发表于2016-07-06 18:07 被阅读179次

学习RxJava之前,我们可能会好奇为什么叫做RxJava。如果你不知道ReactiveX的话,那么你可能还真不知道什么是Rx。

Rx介绍

ReactiveX是Reactive Extensions的缩写,一般简写为Rx。最初是LINQ的一个扩展,由微软的架构师Erik Meijer领导的团队开发,在2012年11月开源,Rx是一个编程模型,目标是提供一致的编程接口,帮助开发者更方便的处理异步数据流。Rx的大部分语言库由ReactiveX这个组织负责维护,比较流行的有RxJava/RxJS/Rx.NET,社区网站是 reactivex.io

什么是ReactiveX

微软给的定义是,Rx是一个函数库,让开发者可以利用可观察序列和LINQ风格查询操作符来编写异步和基于事件的程序,使用Rx,开发者可以用Observables表示异步数据流,用LINQ操作符查询异步数据流, 用Schedulers参数化异步数据流的并发处理,Rx可以这样定义:Rx = Observables + LINQ + Schedulers。 
  ReactiveX.io给的定义是,Rx是一个使用可观察数据流进行异步编程的编程接口,ReactiveX结合了观察者模式、迭代器模式和函数式编程的精华。

Rx模式特点

  • 使用观察者模式:
      创建:Rx可以方便的创建事件流和数据流
      组合:Rx使用查询式的操作符组合和变换数据流
      监听:Rx可以订阅任何可观察的数据流并执行操作

  • 简化代码
      函数式风格:对可观察数据流使用无副作用的输入输出函数,避免了程序里错综复杂的状态
      简化代码:Rx的操作符通通常可以将复杂的难题简化为很少的几行代码
      异步错误处理:传统的try/catch没办法处理异步计算,Rx提供了合适的错误处理机制
      轻松使用并发:Rx的Observables和Schedulers让开发者可以摆脱底层的线程同步和各种并发问题

使用Observable的优势

Rx扩展了观察者模式用于支持数据和事件序列,添加了一些操作符,它让你可以声明式的组合这些序列,而无需关注底层的实现:如线程、同步、线程安全、并发数据结构和非阻塞IO。
  Observable通过使用最佳的方式访问异步数据序列填补了这个间隙


访问方式

  Rx的Observable模型让你可以像使用集合数据一样操作异步事件流,对异步事件流使用各种简单、可组合的操作。###Rx是一个多语言的实现
  Rx在大量的编程语言中都有实现,并尊重实现语言的风格,而且更多的实现正在飞速增加。

响应式编程

Rx提供了一系列的操作符,你可以使用它们来过滤(filter)、选择(select)、变换(transform)、结合(combine)和组合(compose)多个Observable,这些操作符让执行和复合变得非常高效。
  你可以把Observable当做Iterable的推送方式的等价物,使用Iterable,消费者从生产者那拉取数据,线程阻塞直至数据准备好。使用Observable,在数据准备好时,生产者将数据推送给消费者。数据可以同步或异步的到达,这种方式更灵活。
  下面的例子展示了相似的高阶函数在Iterable和Observable上的应用:

// Iterable
getDataFromLocalMemory() 
.skip(10) 
.take(5) 
.map({ s -> return s + " transformed" }) 
.forEach({ println "next => " + it })
// Observable
getDataFromNetwork()
 .skip(10) 
.take(5)
 .map({ s -> return s + " transformed" }) 
.subscribe({ println "onNext => " + it })

Observable类型给GOF的观察者模式添加了两种缺少的语义,这样就和Iterable类型中可用的操作一致了:
  1、生产者可以发信号给消费者,通知它没有更多数据可用了(对于Iterable,一个for循环正常完成表示没有数据了;对于Observable,就是调用观察者的onCompleted方法)
  2、生产者可以发信号给消费者,通知它遇到了一个错误(对于Iterable,迭代过程中发生错误会抛出异常;对于Observable,就是调用观察者(Observer)的onError方法)
  有了这两种功能,Rx就能使Observable与Iterable保持一致了,唯一的不同是数据流的方向。任何对Iterable的操作,你都可以对Observable使用。

名词定义

  • Reactive :反应式、响应式
  • Iterable :可迭代对象
  • Observable : 被观察对象、被观察者
  • Observer :观察者对象

相关文章

  • RxJava前世今生

    需求 聚合数据API提供了搜索某个城市未来一周每天的天气详细信息,包含最低最高气温、风速、湿度等数据。我们的任务就...

  • RxJava之前世今生(一)

    学习RxJava之前,我们可能会好奇为什么叫做RxJava。如果你不知道ReactiveX的话,那么你可能还真不知...

  • 前世今生

    佛说因果,今生果报是由前世之因。 人们常想是否有前世。我觉得前世是有的,昨天便是前世,今天便是今生。昨日所中之因,...

  • 伴浮生

    不念前世,不待来生 有谁在细语今生 不念前世,不待来生 有谁在相思今生 长情伴浮生 得之我之幸

  • 悲伤的轮回

    曾经的我有百万种差别 但有一点 却是一致的 前世之我一如今生之我 今生之我一如来世之我 都是爱你的 只不过 前世之...

  • 前世今生之A

    不会取名字…A和B是男的,C是女的 前世1 A爱了B一辈子追了B一辈子对B好了一辈子。到头来,伤透了朋友家人的心,...

  • 前世今生之A

    前世2 A其实一点也不淡然,他也一点也不想离开。 他不能回国,因为B的事,他倾尽全力保护保住公司,保住员工们的生活...

  • Unity C#基础之 多线程的前世今生(下) 扩展篇

    在前面两篇Unity C#基础之 多线程的前世今生(上) 科普篇和Unity C#基础之 多线程的前世今生(中) ...

  • 不了了之

    不了情缘,今生了之 前世缘,今生情 欠我三刀,欠你三刀 不了了之

  • 文明密码系列之: 一碗面条的前世今生

    文明密码系列之: 一碗面条的前世今生 文明密码系列之 一碗面条的前世今生 20世纪人类最伟大的发明之一,也被日本人...

网友评论

    本文标题:RxJava之前世今生(一)

    本文链接:https://www.haomeiwen.com/subject/nevkjttx.html