1.什么是ReactiveX(下面简称Rx)?
Rx是一个编程模型,目标是提供一致的编程接口,帮助开发者更方便的处理异步数据流
使用Rx,开发者可以用Observables表示异步数据流,用LINQ(读作Link)操作符查询异步数据流, 用Schedulers参数化异步数据流的并发处理,Rx可以这样定义:Rx = Observables + LINQ + Schedulers。
2.优点
①可组合:一般Java处理有先后顺序的并发请求的时候会涉及到嵌套回调,这样代码就会变成一层一层的,不仅不美观,而且也不容易维护 Rx将异步调用封装成Observable,开发者可以非常方便的在中途操作数据流
②轻松处理并发:使用其Scheduler可以非常方便的切换数据流执行的线程
3.Rx是基于观察者模式的,观察者就像一个哨兵,他负责订阅观察者对象。你可以定义一种获取和变换数据的机制,当数据就绪的时候,这种机制就会分发数据给观察者哨兵。
传统的方法调用模型是这样的,你通过调用一个方法,这个方法返回一些数据给你,然后你用这个返回的数据做一些事情
但是Rx的异步模型是,【你将这个异步调用本身定义为一个Observable】,观察者通过订阅操作关联到这个Observable。接下来,你可以继续你的业务逻辑,当方法返回的时候,Observable会发射结果,观察者的方法就会处理结果
4.subscribe方法用于将观察者连接到Observable,但是注意,这个方法是在Observable的调用链之中的,仔细想想也不难明白,因为被观察者需要持有观察者对象才能够调用观察者的方法来处理结果。一般来说,观察者需要实现以下方法的子集:
①onNext(T item):
Observable调用这个方法发射数据 方法的参数就是Observable发射的数据 这个方法可能被调用多次 取决于具体的实现
②onError(Exception ex):
当Observable遇到错误或者无法返回期望的数据时会调用这个方法,这个调用会终止Observable,后续不会再调用onNext和onCompleted,onError方法的参数是抛出的异常。
③onComplete:
正常终止,如果没有遇到错误,Observable在最后一次调用onNext之后调用此方法。
5.Observables的"热"和"冷":
一个"热"的Observable可能一创建完就开始发射数据,因此所有后续订阅它的观察者可能从序列中间的某个位置开始接受数据(有一些数据错过了)。
一个"冷"的Observable会一直等待,直到有观察者订阅它才开始发射数据,因此这个观察者可以确保会收到整个数据序列。
在一些ReactiveX实现里,还存在一种被称作Connectable的Observable,不管有没有观察者订阅它,这种Observable都不会开始发射数据,除非Connect方法被调用。
6.ReactiveX真正强大的地方在于它的操作符,操作符让你可以变换、组合、操纵和处理Observable发射的数据。
Rx的操作符让你可以用声明式的风格组合异步操作序列,它拥有回调的所有效率优势,同时又避免了典型的异步系统中嵌套回调的缺点。
下面是常用的操作符列表:
创建操作 Create, Defer, Empty/Never/Throw, From, Interval, Just, Range, Repeat, Start, Timer
变换操作 Buffer, FlatMap, GroupBy, Map, Scan和Window
过滤操作 Debounce, Distinct, ElementAt, Filter, First, IgnoreElements, Last, Sample, Skip, SkipLast, Take, TakeLast
组合操作 And/Then/When, CombineLatest, Join, Merge, StartWith, Switch, Zip
错误处理 Catch和Retry
辅助操作 Delay, Do, Materialize/Dematerialize, ObserveOn, Serialize, Subscribe, SubscribeOn, TimeInterval, Timeout, Timestamp, Using
条件和布尔操作 All, Amb, Contains, DefaultIfEmpty, SequenceEqual, SkipUntil, SkipWhile, TakeUntil, TakeWhile
算术和集合操作 Average, Concat, Count, Max, Min, Reduce, Sum
转换操作 To
连接操作 Connect, Publish, RefCount, Replay
反压操作,用于增加特殊的流程控制策略的操作符