RxJava2_2:流程及关键对象的理解

来源:互联网 发布:linux 第二个mysql5.7 编辑:程序博客网 时间:2024/05/11 04:30

RxJava2:流程及关键对象的理解

参考:

http://blog.csdn.net/column/details/rxjava.html?&page=2     (这个是rxjava1的)

https://juejin.im/post/5848d96761ff4b0058c9d3dc

http://www.jianshu.com/p/404a4d9b415a

 

流程:

rxjava采用的是观察者模式,所以这个模式在理解这里很重要。其次rxjava采用的是流式处理。


管道上游和管道下游就分别对应着RxJava中的Observable和Observer,它们之间的连接就对应着subscribe();


注意: 只有当上游和下游建立连接之后, 上游才会开始发送事件. 也就是调用了subscribe() 方法之后才开始发送事件。


在emitter.onNext发出数据流之后doNext是将emitter发出的数据留作副本并行地进行处理,处理后的数据并不影响传递的observable中数据流中的数据。最后emmiter.onNext发出的数据是在观察者的onNext中得到对应的处理。

对象:

Rxjava为响应式编程,采用的是观察这模式,对其的理解都是按照观察者模式那套来理解的。

Observable为被观察者,observer为观察者。

Observable:被观察者

 

Observer:观察者

 

Flowable:是一个被观察者

 

 

Subscriber:也是一种观察者

在2.0中它与Observer没什么实质的区别,不同的是Subscriber要与Flowable(也是一种被观察者)联合使用,该部分内容是2.0新增的,Obsesrver用于订阅Observable,而Subscriber用于订阅Flowable。

 

Comsumer:观察者

如果把rxjava的观察者当做事件发生者,而comsumer就是事件消费者。在rxjava2中仍然保留了这种简化订阅方法。

 

ObservableEmitter:被观察者事件发送对象

用来发出事件的,它可以发出三种类型的事件,通过调用emitter的onNext(T value)、onComplete()和onError(Throwable error)就可以分别发出next事件、complete事件和error事件

发送事件需要满足的规则:

l   上游可以发送无限个onNext, 下游也可以接收无限个onNext.


l   当上游发送了一个onComplete后, 上游onComplete之后的事件将会继续发送, 而下游收到onComplete事件之后将不再继续接收事件.


l   当上游发送了一个onError后, 上游onError之后的事件将继续发送, 而下游收到onError事件之后将不再继续接收事件.


l   上游可以不发送onComplete或onError.

l   最为关键的是onComplete和onError必须唯一并且互斥, 即不能发多个onComplete, 也不能发多个onError, 也不能先发一个onComplete,然后再发一个onError, 反之亦然

 

Disposable:切断监测对象

可以把它理解成两根管道之间的一个机关, 当调用它的dispose()方法时, 它就会将两根管道切断, 从而导致下游收不到事件。(上游依然可以发送,只是下游不再接受)

 

Scheduler:相当于线程控制器

RxJava 通过它来指定每一段代码应该运行在什么样的线程。RxJava 已经内置了几个Scheduler ,它们已经适合大多数的使用场景,实现发送消息和接受消息在不同线程中进行的目的。

 

Flowable VS Subscriber

Observable和Observer在处理同步订阅也就是在一个线程中的时候上游发送一个事件下游接受一个事件是没有什么问题的,而当处理异步订阅也就是上游和下游不在同一个线程中时上游发送数据不需要等待下游接收, 因为两个线程并不能直接进行通信, 因此上游发送的事件并不能直接到下游里去, 上游把所有的事件发送到一个可以存储的池里面去(相当于Handler中的消息队列), 下游从队列里取出事件来处理, 因此, 当上游发事件的速度太快, 下游取事件的速度太慢, 队列就会迅速装满, 然后溢出来, 最后就OOM了.当然我们也可以通过控制上游消息的发送速度和发送数量来控制。不过Subscriber和Flowable的出现就完美的解决了OOM这个问题.



区别

1、创Flowable的时候增加了一个参数, 这个参数是用来选择背压,也就是出现上下游流速不均衡的时候应该怎么处理的办法。

2、下游的onSubscribe方法中传给我们的不再是Disposable了, 而是Subscription。

subscription.cancel()也可以切断水管, 不同的地方在于Subscription增加了一个void request(long n)方法,。Flowable在设计的时候采用了一种新的思路也就是响应式拉取的方式来更好的解决上下游流速不均衡的问题,我们把request当做是一种能力, 当成下游处理事件的能力, 下游能处理几个就告诉上游我要几个, 这样只要上游根据下游的处理能力来决定发送多少事件, 就不会造成一窝蜂的发出一堆事件来, 从而导致OOM

 

 

 

 

 

 

 

 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 婴儿衘乳不正确只吸乳头怎么办 怀孕7个月了晚上睡不着怎么办 尚德学校学费交了一半退学怎么办 随着年龄的增长胸越来越来小怎么办 运动文胸里边的海绵垫会乱跑怎么办 带胸罩时在外面忽然扣子开了怎么办 我的脸一边大一边小怎么办 桶装水盖子吸在饮水机了怎么办? 孕37周大腿内侧被内裤磨烂怎么办 生存指南合成的时候闪退怎么办 王者荣耀队友用语音骂我怎么办? 轨道衡电子计量数据不对上怎么办 孕5个月胎儿发育慢怎么办 扎高马尾后面头发扎不上去怎么办 吃了不太新鲜的肉怎么办 军训腿疼的蹲不下去怎么办 面对对老师不尊重的学生该怎么办? 当学生犯了错老师应该怎么办? 用木棒按摩脚底感觉有疙瘩怎么办 人流后按摩造成子宫复位不好怎么办 留守儿童不去学校你该怎么办 在校读书的留守儿童自身应该怎么办 进行定向越野活动时迷路了怎么办 温十系统更新后卡死无法开机怎么办 在武术比赛中被打昏了了怎么办 孩子被欺负了怎么办怎么告诉孩子 网贷雇佣黑社会到家要钱要怎么办 穿越火线枪声和脚步声没有了怎么办 魅蓝5s快充不了怎么办 门的密码输错3次怎么办 孩子剧烈运动后咳嗽到吐怎么办 前列腺穿刺后血尿一个月了怎么办 两年体检尿潜血2+怎么办严重吗? 尿结石尿不出来堵住了怎么办 四岁宝宝一直咳嗽很厉害怎么办 老公家的事业不想做了怎么办 苹果6sp手机卡顿反应慢怎么办 工程之星x3手薄密码忘了怎么办 煮绿豆汤把绿豆炒焦了怎么办 想问别人问题又不好开口怎么办 宝宝认人晚上哭着找阿姨怎么办呀