Rxjava-基础知识

rxjava

五种观察者模式

被观察者 观察者 描述
Observable Observer 能够发射0或n个数据,并以成功或失败结束
Flowable Subscriber 能够发射0或n个数据,并以成功或失败结束。支持背压,可以控制数据源的发射速度
Single SingleObserver 只发射单个数据或错误事件
Comletable CompleteableObserver 从来不发射数据,只处理onComplete和onError事件,可以看成Rx的Runnable
Maybe MabyeObserver 能够发射0或1个数据,要么成功,要么失败,有点类似于Optional

do操作符

do操作符给Observable的声明周期的各个阶段加上一些列的回调监听。

下表总结了一些常用的do操作符,按照执行的顺序。

操作符 描述
doOnSubscribe 一旦观察者订阅了Observable,它就会被调用
doOnLifeCycle 可以在观察者订阅之后,设置是否取消订阅
doOnNext 它产生的observable每发射一项数据就会调用它一次,它的Consumer接受发射的数据项。一般用于在subscribe之前对数据进行处理
doOnEach 它产生的Observable没法涉一项数据就会调用它一次,不仅包括onNext,还包括onError和onCompleted
doOnAfterNext 在onNext之后执行,而doOnNext在onNext之前执行
doOnComplete 它产生的Observable在正常终止调用onComplete时被调用
doFinally 当它产生的Observable终止之后会被调用,无论是正常终止还是异常终止。doFinally优先doAfterTerminate的调用
doAfterTerminate 注册一个Action,当Observable调用onComplete或onError时触发

Observable分类

observable分为Hot和Cold。

Hot Observable无论有没有观察者进行订阅,事件始终会发生。当Hot Observable有多个订阅者时,Hot Observable与订阅者们的关系是一对多的关系,可以与多个订阅者共享信息。

Cold Observable是只有观察者订阅了,才开始执行发射数据流的代码。并且Cold Observable和Observer只能是一对一的关系。当有多个不同的订阅者时,消息是重新完整发送的。也就是说对Cold Observable而言,有多个Observser的时候,他们各自的消息是独立的。

Cold Observable

Observable的just,create,range,fromXXX等操作符都能生成Cold Observable。

Cold Observable和Hot Observable的转换

  1. 使用publish,生成ConnectableObservable,将原来的Observable转换成ConnectableObservable。
  2. 使用Subject/Processor。Subject和Processor作用相同,Processor是RxJava 2.x新增的类,继承自Flowable,支持背压控制(Back Presure),而Subject则不支持背压控制。Subject既是Observable又是Observer。Subject作为观察者,可以订阅目标Cold Observable,使对方开始发送事件,同时它又作为Observable转发或者发送新的事件,让Cold Observable借助Subject转换为Hot Observable。Subject不是线程安全的,如果想要线程安全,则需要调用toSerialized()。

热Observable转为Cold Observable

  1. 使用ConnectableObservable的refCount操作符。refcount操作符把从一个可连接的Observable连接和断开过程自动化了。操作一个Observable,返回一个普通的Observable,当第一个订阅者/观察者订阅这个Observable时,RefCount连接到下层的可连接Observable,RefCount跟踪有多少个观察者订阅它,指导最后一个观察者完成,才断开与下层Observable的连接。如果所有的订阅者/观察者都取消订阅了,则数据流停止,如果重新订阅,则重新开始数据流。如果部分观察者取消订阅,则部分观察者重新订阅,则不会从头开始数据流。

  2. 使用share操作符。share操作符封装了publish().refCount()调用。不需要再调用connect方法,直接使用share方法即可。

Flowable

RxJava2.x新增,支持背压。

Maybe,Single,Completable

Single

只有onSUccess,onError事件。onSuccess用于发射数据,且只能发射一个数据,后续数据抛弃。

Subject

Subject既是Observable又是Observer。分为AsyncSubject,BehaviorSubject,ReplaySUbject,PublishSubject。

Subject 发射行为
AsyncSubject 不论订阅发生在什么时候,只发射最后一个数据
BehaviorSubject 发射订阅前的一个数据,和订阅之后的全部数据
ReplaySubject 不论什么时候订阅,都发射全部数据
PublishSubject 发射订阅后的全部数据
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,406评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,732评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,711评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,380评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,432评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,301评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,145评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,008评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,443评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,649评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,795评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,501评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,119评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,731评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,865评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,899评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,724评论 2 354

推荐阅读更多精彩内容