RxJava的基本认识
如果你想学会使用RxJava,那么你应该理解好ReactiveX。如果ReactiveX提供了很多抽象及高层函数。可以使用任何一种运行在JVM上的编程语言来实现这些抽象。那么RxJava就是其中一个实现了ReactiveX的框架。因此要学会RxJava关键是理解ReactiveX。ReactiveX采用观察者模式来实现它的功能。ReactiveX集合了观察者模式(Observer Pattern)、迭代模式(Iterator Pattern)和函数式编程。ReactiveX有非常好的防抖能力(抖动:短时间内多次点击或者输入导致的重复请求)。ReactiveX非常容易创建“事件流”和“数据流”,它还提供了很多类似查询一样的操作符来转换数据。刚刚我们也说了ReactiveX有采用观察者模式,那么我们可以订阅到任何可观察的流中,并在另一边做其他操作,就是说我们观察者收到变化时,可以根据需要做相应处理。
ReactiveX是一个使用可观察的序列集成了异步和基于事件编程的库。ReactiveX扩展了观察者设计模式,支持数据或事件的序列,并添加了允许我们以声明方式将序列组合在一起的操作符,同时抽象出对诸如低级线程、同步、线程安全、并发数据结构和非阻塞I/O等问题。
响应式编程有时会被人叫做“函数响应式编程”,但这是不对的。因为ReactiveX它可能是函数式的,也可能是响应式的。但“函数响应式编程”是不一样的。它们最主要的不同点在于“函数响应式编程”是针对随着时间不断变化的值进行的操作,而ReactiveX是针对随着时间发出的离散值进行的操作。
ReactiveX使用观察者模式是有原因的,ReactiveX的可观察模型允许我们使用与数组等数据项集合相同的简单、可组合的操作来处理异步事件流。Reactive Programming 响应式编程,ReactiveX提供了一组运算符,我们可以使用这些运算符筛选、选择、转换、组合和组合可观察项。这样可以有效地执行和组合。我们可以这样来理解,Observable类(可观察类)在值(数据)可用时,可观察的生产者会将值(数据)推送给消费者。这种方式十方灵活,因为值(数据)可以以异步或同步的方式到达。
Observable类型为观察者模式添加了两个缺失的语义,以匹配Iterable类型中可用的语义:
1.生产者通知消费者没有数据可用的能力,Iterable上的foreach循环完成并正常返回,这种情况下,Observable调用观察者(observer)的onComplete
方法。
2.生产者通知消费者发生了错误的能力。如果迭代期间发生错误,Iterable将引发异常,这种情况下,Observable调用观察者(observer)的onError
方法。
ReactiveX协调了Iterable和observate类型。它们之间唯一的区别是数据流动的方向。这一点非常重要,因为现在可以对Iterable执行任何操作,也可以对Observable执行。
ReactiveX Observables用于组合流和异步数据序列。在ReactiveX中,observer(观察者)注册到Observable对象上,无论Observalbe对象(被观察者)发出什么数据或序列,Observer(观察者)都可以做出相应的处理。
这种模式促进了并发操作,因为它不需要在等待Observalbe对象发出数据时阻塞。相反,它以观察者的形式建立一个哨兵,这个哨兵随时准备在Observable(被观察者)在未来发出的数据或序列时做好响应。
以下这些方法都是观察者连接到一个被观察者的方法,也就是被观察者会在特定的情况下调用观察者的方法:
onNext
:
被观察者调用这个方法,当被观察者发出一条数据时。这个方法会把被观察者发出的这条数据作为一个参数。
onError
:
当被观察者调用这个方法表明生成我们期待的数据时失败了,或者是遇到了一些错误。当这个方法被调用时,就不会再调用onNext
和onCompleted
方法。
onCompleted
:
当Observable最后一次调用onNext
后,如果没有遇到任何错误的话,就会调用这个方法。
根据Observable的约定,onNext
方法可能会被0次或多次调用。紧接着就会调用onComplete
或者onError
方法。调用onNext
我们称其为emissions
of items,调用onComplete
或onError
,我们称其为通知。
Observable 什么时候发出数据呢?一个"Hot" Observable 则会在数据创建完成,就马上触发数据的发送。
一个“cold” Observable对象,在它开始发射项目之前,要等到一个观察者订阅它,这样的观察者就可以从一开始看到整个序列。
ReactiveX真正强大在它的运算符,允许您转换、组合、操作和处理可观察项observable发出的序列,具体如下:
1.用于创建Observables:
- Create:通过编程调用观察者方法从头创建一个可观察对象。
- Defer:在观察者订阅之前不要创建观察对象,并为每个观察者创建一个新的观察对象。其实就是延迟创建。
- Empty/Never/Throw:创建具有非常精确和有限行为的可观察对象
- From:将其他对象或数据结构转换为可观察对象
- Interval:创建一个以特定时间间隔间隔发出整数序列的可观察对象
- Just:将对象或一组对象转换为可观察对象,并发射该对象或这一组对象
- Range:创建一个发出一系列连续整数的可观察对象
- Repeat:创建一个可观察对象,重复发出特定的数据项或数据项序列
- Start:创建发出函数返回值的可观察对象
- Timer:创建一个可观察对象,在给定的延迟后发射一个数据项
2.转换Observable的数据: - Buffer:定期将可观察对象中的项收集成束并发射这些束,而不是一次发射一个数据项。
- FlatMap:将一个可观测对象发出的数据项转换到其他可观测对象中,然后平铺这些可观测对象的发射到一个可观测对象中。
- GroupBy:将一个可观察对象划分为一组可观察对象,每个可观察对象从原始可观察对象中发出一组不同的数据项,按键组织
- Map:通过对每个项应用一个函数来转换由可观察对象发出的数据项
- Scan:对可观察对象发出的每个数据项应用一个函数,然后依次发出每个连续的值
- Window:周期性地将可观察的数据项细分为可观察的窗口,并发射这些窗口,而不是一次发射一个项目
3.过滤Observables: - Debounce:仅当某个特定的时间跨度已过去而未发出另一个数据项时,才从可观察对象中发出数据项。
- Distinct:抑制被观察对象发出的重复项
- ElementAt:只发出被观察对象发出的数据项n
- Filter:仅从可观察对象中发出那些通过谓词测试的数据项
- First:只从可观察对象发出第一个数据项,或满足条件的第一个数据项
- IgnoreElements:不从可观察对象发出任何项目,但反射它的终止通知
- Last:只发出可观察对象发出的最后一个数据项
- Sample:在周期性的时间间隔内发出一个可观察对象最近发出的数据项
- Skip:抑制可观察对象发出的前n个数据项
- SkipLast:抑制可观察对象发出的最后n个数据项
- Take:只发出被观察对象发出的前n个项
- TakeLast:只发出可观察对象发出的最后n个项
4.组合Observables: - And/Then/When:通过
Pattern
和Plan
中介将两个或多个可观察项组合起来 - CombineLatest:当一个项由两个可观察项中的任何一个发出时,将每个可观察项通过指定函数发出的最新项组合起来,并基于该函数的结果发出项
- Join:当来自一个可观察对象的项在一个时间窗口内根据另一个可观察对象的项发出时,将两个可观察对象发出的项组合起来
- Merge:将多个观测值合并为一个
- StartWith:在开始从可观察源发射项目之前,发射一个指定的项目序列
- Switch:将发出可观察项的可观察项转换为单个可观察项,该可观察项由最近发出的可观察项发出
- Zip:通过指定的函数将多个观测值的发射组合在一起,并根据该函数的结果为每个组合发射单个项
5.错误处理运算符: - Catch:通过无错误地连续序列从onError通知中恢复.
- Retry:如果一个可观察到的源发送了一个错误通知,重新订阅它,希望它能够顺利完成
6.实用工具运算符: - Delay:将可观测到的放射物在时间上向前移动一个特定的量
- Do:注册一个操作来处理各种可观察生命周期事件
- Materialize/Dematerialize:表示已发出的项和作为已发出项发送的通知,或反转此过程
- ObserveOn:指定观察者将在其上观察该可观察对象的调度程序
- Serialize:强制可观察对象进行序列化调用并保持良好的行为
- Subscribe:根据可观察对象的发射和通知进行操作
- SubscribeOn:指定订阅可观察对象时应使用的调度程序
- TimeInterval:将发射项目的可观察对象转换为发射这些发射之间经过的时间的指示的可观察对象
- Timeout:反映可观察对象,如果在一段特定的时间内没有发出任何项,则发出错误通知
- Timestamp:将一个时间戳附加到由一个可观察对象发出的每个项上
- Using:创建一个与可观察对象具有相同寿命周期的一次性资源
7.条件运算符和布尔运算符: - All:确定由一个可观察对象发出的所有项是否满足某些标准
- Amb:给定两个或多个源可观察项,仅从其中第一个可观察项发出所有项
- Contains:确定一个可观察对象是否发射一个特定的项
- DefaultIfEmpty:从源Observable发出项,或者如果源Observable不发出任何内容,则为默认项
- SequenceEqual:确定两个可观察对象是否发出相同的项目序列
- SkipUntil:丢弃一个可观察对象发出的项,直到第二个可观察对象发出一个项
- SkipWhile:丢弃由可观察对象发出的项,直到指定的条件变为false
- TakeUntil:在第二个可观察对象发出一个项或终止后,丢弃由一个可观察对象发出的项
- TakeWhile:在指定条件变为false后丢弃可观察对象发出的项
8.数学计算和求和操作符: - Average:计算可观察对象发出的数字的平均值,并发出该平均值
- Concat:从两个或两个以上的可观测对象发出数据项,但而不交错它们
- Count:计算可观察源发出的项数,并仅发出此值
- Max:确定并发出一个可观察对象发出的最大值项
- Min:确定并发出可观察到的最小值项
- Reduce:对可观察对象发出的每个项应用一个函数,然后依次发出最终值
- Sum:计算一个可观察对象发出的数字的总和,并发出这个总和
9.转换Observables: - To:将一个可观察的对象转换成另一个对象或数据结构
10.可连接Observable运算符: - Connect:指示可连接的可观察对象开始向其订阅者发送数据项
- Publish:把一个普通的可观察的转化为一个可连接的可观察的
- RefCount:使一个可连接的可观察对象表现得像普通的可观察对象
- Replay:确保所有观察者看到相同的发出的数据项序列,即使他们订阅了被观察对象已经开始发射项目
11.背压操作符:
包括执行特定流控制策略的各种操作符。应对可观察对象的策略,这些可观察对象产生数据项的速度快于观察者消耗数据项的速度
在ReactiveX中,一个可观察对象发出的数据项比操作符或观察者消耗它们的速度要快。这就产生了一个问题:如何处理积压的大量未消耗的数据项。
例如,假设使用Zip运算符压缩两个无限的可观察对象,其中一个发出的项目是另一个的两倍。运算符的一个幼稚的实现必须保持一个不断扩展的缓冲区,由更快的可观察对象发出的项最终与较慢的可观察对象发出的项相结合。这可能导致ReactiveX占用大量的系统资源。
在ReactiveX中,您可以使用多种策略来执行流控制和背压,以缓解当快速生成的可观察对象遇到消耗缓慢的观察者时所引起的问题
一个“cold”的Observable对于由ReactiveX的一些实现实现的反压力的反应拉模型来说是理想的。“hot”的Observable通常不能很好地处理反应拉模型,并且是其他流控制策略的更好的候选对象,例如使用本页中描述的操作符,或者诸如Buffer、Sample、Debounce或Window之类的操作符。
大多数运算符运算完后都会返回observable,这允许我们在链中一个接一个地应用这些运算符。
文章来源: blog.csdn.net,作者:WongKyunban,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/weixin_40763897/article/details/109501573
- 点赞
- 收藏
- 关注作者
评论(0)