什么是ReactiveX
微软给的定义是,Rx是一个函数库,让开发者可以利用可观察序列和LINQ风格查询操作符来编写异步和基于事件的程序,使用Rx,开发者可以用Observables表示异步数据流,用LINQ操作符查询异步数据流, 用Schedulers参数化异步数据流的并发处理,Rx可以这样定义:Rx = Observables + LINQ + Schedulers。
ReactiveX.io给的定义是,Rx是一个使用可观察数据流进行异步编程的编程接口,ReactiveX结合了观察者模式、迭代器模式和函数式编程的精华。
ReactiveX的应用
很多公司都在使用ReactiveX,例如Microsoft、Netflix、Github、Trello、SoundCloud。
ReactiveX宣言
ReactiveX不仅仅是一个编程接口,它是一种编程思想的突破,它影响了许多其它的程序库和框架以及编程语言。
Rx模式
使用观察者模式
- 创建:Rx可以方便的创建事件流和数据流
- 组合:Rx使用查询式的操作符组合和变换数据流
- 监听:Rx可以订阅任何可观察的数据流并执行操作
简化代码
- 函数式风格:对可观察数据流使用无副作用的输入输出函数,避免了程序里错综复杂的状态
- 简化代码:Rx的操作符通通常可以将复杂的难题简化为很少的几行代码
- 异步错误处理:传统的try/catch没办法处理异步计算,Rx提供了合适的错误处理机制
- 轻松使用并发:Rx的Observables和Schedulers让开发者可以摆脱底层的线程同步和各种并发问题
使用Observable的优势
Rx扩展了观察者模式用于支持数据和事件序列,添加了一些操作符,它让你可以声明式的组合这些序列,而无需关注底层的实现:如线程、同步、线程安全、并发数据结构和非阻塞IO。
Observable通过使用最佳的方式访问异步数据序列填补了这个间隙
单个数据 多个数据 同步 T getData()
Iterable<T> getData()
异步 Future<T> getData()
Observable<T> getData()
Rx的Observable模型让你可以像使用集合数据一样操作异步事件流,对异步事件流使用各种简单、可组合的操作。
Observable可组合
对于单层的异步操作来说,Java中Future对象的处理方式是非常简单有效的,但是一旦涉及到嵌套,它们就开始变得异常繁琐和复杂。使用Future很难很好的组合带条件的异步执行流程(考虑到运行时各种潜在的问题,甚至可以说是不可能的),当然,要想实现还是可以做到的,但是非常困难,或许你可以用
Future.get()
,但这样做,异步执行的优势就完全没有了。从另一方面说,Rx的Observable一开始就是为组合异步数据流准备的。Observable更灵活
Rx的Observable不仅支持处理单独的标量值(就像Future可以做的),也支持数据序列,甚至是无穷的数据流。
Observable
是一个抽象概念,适用于任何场景。Observable拥有它的近亲Iterable的全部优雅与灵活。Observable是异步的双向push,Iterable是同步的单向pull,对比:
事件 Iterable(pull) Observable(push) 获取数据 T next()
onNext(T)
异常处理 throws Exception
onError(Exception)
任务完成 !hasNext()
onCompleted()
Observable无偏见
Rx对于对于并发性或异步性没有任何特殊的偏好,Observable可以用任何方式实现,线程池、事件循环、非阻塞IO、Actor模式,任何满足你的需求的,你擅长或偏好的方式都可以。无论你选择怎样实现它,无论底层实现是阻塞的还是非阻塞的,客户端代码将所有与Observable的交互都当做是异步的。
Observable是如何实现的?
public Observable<data> getData();
- 它能与调用者在同一线程同步执行吗?
- 它能异步地在单独的线程执行吗?
- 它会将工作分发到多个线程,返回数据的顺序是任意的吗?
- 它使用Actor模式而不是线程池吗?
- 它使用NIO和事件循环执行异步网络访问吗?
- 它使用事件循环将工作线程从回调线程分离出来吗?
从Observer的视角看,这些都无所谓,重要的是:使用Rx,你可以改变你的观念,你可以在完全不影响Observable程序库使用者的情况下,彻底的改变Observable的底层实现。
使用回调存在很多问题
回调在不阻塞任何事情的情况下,解决了
Future.get()
过早阻塞的问题。由于响应结果一旦就绪Callback就会被调用,它们天生就是高效率的。不过,就像使用Future一样,对于单层的异步执行来说,回调很容易使用,对于嵌套的异步组合,它们显得非常笨拙。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类型中可用的操作一致了:
- 生产者可以发信号给消费者,通知它没有更多数据可用了(对于Iterable,一个for循环正常完成表示没有数据了;对于Observable,就是调用观察者的
onCompleted
方法)- 生产者可以发信号给消费者,通知它遇到了一个错误(对于Iterable,迭代过程中发生错误会抛出异常;对于Observable,就是调用观察者(Observer)的
onError
方法)有了这两种功能,Rx就能使Observable与Iterable保持一致了,唯一的不同是数据流的方向。任何对Iterable的操作,你都可以对Observable使用。
名词定义
这里给出一些名词的翻译
- Reactive 直译为反应性的,有活性的,根据上下文一般翻译为反应式、响应式
- Iterable 可迭代对象,支持以迭代器的形式遍历,许多语言中都存在这个概念
- Observable 可观察对象,在Rx中定义为更强大的Iterable,在观察者模式中是被观察的对象,一旦数据产生或发生变化,会通过某种方式通知观察者或订阅者
- Observer 观察者对象,监听Observable发射的数据并做出响应,Subscriber是它的一个特殊实现
- emit 直译为发射,发布,发出,含义是Observable在数据产生或变化时发送通知给Observer,调用Observer对应的方法,文章里一律译为发射
- items 直译为项目,条目,在Rx里是指Observable发射的数据项,文章里一律译为数据,数据项
ReactiveX
时间: 2024-10-15 16:56:48
ReactiveX的相关文章
初识Android的ReactiveX
初识Android的ReactiveX 开发一个复杂一点的Android应用都会用到网络请求,交互和动画.这些都意味着 要写很多的回调嵌套.这样的代码也被称为callback hell(回调地狱).这样的 代码不仅长,很难理解,而且也是错误高发的地方.ReactiveX 提供了一个清晰.准确处理异步问题和事件的方法. RxJava是一个ReactiveX在JVM上的实现,由NetFlix开发.这个库在Java开发者中 广为流传.这个教程中你会学到如何在Android应用开发中使用RxJava.这
Failed to resolve:io.reactivex:rxandroid:1.1.0
问题描述 Failed to resolve:io.reactivex:rxandroid:1.1.0 Failed to resolve:io.reactivex:rxandroid:1.1.0 这个问题怎么解决 解决方案 http://blog.csdn.net/lxk_1993/article/details/50969051 解决方案二: build.gradle Failed to resolve:me.relex:circleindicator:1.1.5Conversion to
RX系列一 | ReactiveX根源 | 观察者模式分析
RX系列一 | ReactiveX根源 | 观察者模式分析 Rx的响应式编程算是很火了,对吧,但是我的工作基本上就不会接触,所以学习的比较晚,到现在才分享给大家,我们一点点的去学,当你看完这整个系列的博客的时候,我相信你最起码也是能把Rx的操作放入你的项目中,既然如此,那我们就开始吧! 一.资料 现在的资料都烂大街了,我也是看这些资料学的,先分享出来 ReactiveX GitHub RxAndroid GitHub RxJava GitHub Android开发技术周报特刊之RxJava&Rx
RxJava源码初探
一.前言 RxJava是用java实现的ReactiveX(Reactive Extensions)框架开源库.ReactiveX则是大名鼎鼎的响应式编程.而响应式编程和观察者模式紧紧的相关联.在看RxJava的源码中,分析起来会有点麻烦,所以才有了这篇文章,和对这个有兴趣的同学一起窥探一二. 二.观察者模式 2.1 基本原理 观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式即让多个观察者对象同时监听某一个主题对象.这个主题对象在状态上发生变化时,会通知所有观
人人都会设计模式:03-策略模式--Strategy
版权声明:本文为博主原创文章,未经博主允许不得转载 公众号:TigerChain 欢迎关注有更多文章等你来读 教程简介 1.阅读对象 本篇教程适合新手阅读,老手直接略过 2.教程难度 初级,本人水平有限,文章内容难免会出现问题,如果有问题欢迎指出,谢谢 3.Demo 地址 https://github.com/githubchen001/DesignPattern 请看 Strategy 部分 正文 一.什么是策略模式 1. 生活中的策略 比如说我要出行旅游,那么出行方式有--飞机.自驾游.火车
swift常用的第三方库列表
https://github.com/Alamofire/Alamofire 网络请求库 https://github.com/SwiftyJSON/SwiftyJSON 更易用的json https://github.com/danielgindi/ios-charts 图形图表库 https://github.com/MengTo/Spring 封装了一些动画的库 https://github.com/Ramotion/animated-tab-bar tabbar实现动画 https://
我的Android进阶之旅------&;gt;RxJava学习资料汇总
在响应式编程中,应该牢记以下两点: everything is a stream(一切皆流) don't break the chain(不要打断链式结构) 记住,可观测序列就像一条河,它们是流动的.你可以"过滤"一条河,你可以"转换"一条河,你可以将两条河合并成一条,然后它依旧是流动的.最后,它将成为你想要的那条河. "Be Water,my friend" --Bruce Lee(李小龙) -------------------------
rxjs简单入门
rxjs简单入门 rxjs全名Reactive Extensions for JavaScript,Javascript的响应式扩展, 响应式的思路是把随时间不断变化的数据.状态.事件等等转成可被观察的序列(Observable Sequence),然后订阅序列中那些Observable对象的变化,一旦变化,就会执行事先安排好的各种转换和操作 rxjs适用于异步场景,即前端交互中接口请求.浏览器事件以及自定义事件.通过使用rxjs带给我们前所未有的开发体验. 统一异步编程的规范,不管是Promi
《Kotin 极简教程》第14章 使用 Kotlin DSL
第14章 使用 Kotlin DSL 最新上架!!!< Kotlin极简教程> 陈光剑 (机械工业出版社) 可直接打开京东,淘宝,当当===> 搜索: Kotlin 极简教程http://www.jianshu.com/p/35b487734339 我们在前面的章节中,已经看到了 Kotlin DSL 的强大功能.例如Gradle 的配置文件 build.gradle (Groovy),以及前面我们涉及到的Gradle Script Kotlin(Kotlin).Anko(Kotlin)