RxJava之二——Single和Subject
来源:互联网 发布:淘宝网打不开 编辑:程序博客网 时间:2024/06/09 13:55
转载请标明出处:http://blog.csdn.net/xx326664162/article/details/69568487 文章出自:薛瑄的博客
你也可以查看我的其他同类文章,也会让你有一定的收货!
关于RxJava,从表面上看起来很容易使用,但是如果理解不够深刻,使用过程中,往往会出现一些问题,所以我写了五篇文章,从入门到精通,从简单的使用到部分源码详解,希望能给读者一个质的飞跃:
1、RxJava之一——一次性学会使用RxJava RxJava简单的使用和使用它的好处
2、RxJava之二——Single和Subject 与Observable举足轻重的类,虽然用的少,但应该知道
3、RxJava之三——RxJava 2.0 全部操作符示例
4、RxJava之四—— Lift()详解 想要了解Operators,Lift()一定要学习
5、RxJava之五—— observeOn()与subscribeOn()的详解Scheduler线程切换的原理
6、RxJava之六——RxBus 通过RxJava来替换EventBus
下面介绍的Single和Subject,可以看做是Observable的变种或者拓展。没有Observable的使用频率高,但是要知道有这么两个东西。免得以后碰上不知所措。
Single
RxJava(以及它派生出来的RxGroovy和RxScala)中有一个名为Single的Observable变种。
Single类似于Observable,不同的是,它总是只发射一个值,或者一个错误通知,而不是发射一系列的值。
因此,不同于Observable需要三个方法onNext, onError, onCompleted,订阅Single只需要两个方法:
onSuccess - Single发射单个的值到这个方法
onError - 如果无法发射需要的值,Single发射一个Throwable对象到这个方法
Single只会调用这两个方法中的一个,而且只会调用一次,调用了任何一个方法之后,订阅关系终止。
Single的操作符
Single也可以组合使用多种操作,一些操作符让你可以混合使用Observable和Single:
操作符图示
详细的图解可以参考英文文档:Single
Subject
Subject可以看成是一个桥梁或者代理,在某些ReactiveX实现中(如RxJava),它同时充当了Observer和Observable的角色。因为它是一个Observer,它可以订阅一个或多个Observable;又因为它是一个Observable,它可以转发它收到(Observe)的数据,也可以发射新的数据。
由于一个Subject订阅一个Observable,它可以触发这个Observable开始发射数据(如果那个Observable是”冷”的–就是说,它等待有订阅才开始发射数据)。因此有这样的效果,Subject可以把原来那个”冷”的Observable变成”热”的。
Subject的种类
针对不同的场景一共有四种类型的Subject。他们并不是在所有的实现中全部都存在,而且一些实现使用其它的命名约定(例如,在RxScala中Subject被称作PublishSubject)。
1、AsyncSubject
一个AsyncSubject只在原始Observable完成后,发射来自原始Observable的最后一个值。(如果原始Observable没有发射任何值,AsyncObject也不发射任何值)它会把这最后一个值发射给任何后续的观察者。
然而,如果原始的Observable因为发生了错误而终止,AsyncSubject将不会发射任何数据,只是简单的向前传递这个错误通知。
2、BehaviorSubject
当观察者订阅BehaviorSubject时
- 它开始发射订阅原始Observable前,发射的最后一个数据(如果此时还没有收到任何数据,它会发射一个默认值),
- 然后继续发射任何来自原始Observable的数据。
然而,如果原始的Observable因为发生了一个错误而终止,BehaviorSubject将不会发射任何数据,只是简单的向前传递这个错误通知。
3、PublishSubject
PublishSubject只会把在订阅发生的时间点之后来自原始Observable的数据发射给观察者。需要注意的是,PublishSubject可能会一创建完成就立刻开始发射数据(除非你可以阻止它发生),因此这里有一个风险:在Subject被创建后到有观察者订阅它之前这个时间段内,一个或多个数据可能会丢失。如果要确保来自原始Observable的所有数据都被分发,你需要这样做:或者使用Create创建那个Observable以便手动给它引入”冷”Observable的行为(当所有观察者都已经订阅时才开始发射数据),或者改用ReplaySubject。
如果原始的Observable因为发生了一个错误而终止,PublishSubject将不会发射任何数据,只是简单的向前传递这个错误通知。
4、ReplaySubject
ReplaySubject会发射所有来自原始Observable的数据给观察者,无论它们是何时订阅的。也有其它版本的ReplaySubject,在重放缓存增长到一定大小的时候或过了一段时间后会丢弃旧的数据(原始Observable发射的)。
如果你把ReplaySubject当作一个观察者使用,注意不要从多个线程中调用它的onNext方法(包括其它的on系列方法),这可能导致同时(非顺序)调用,这会违反Observable协议,给Subject的结果增加了不确定性。
RxJava的对应类
假设你有一个Subject,你想把它传递给其它的代理或者暴露它的Subscriber接口,你可以调用它的asObservable方法,这个方法返回一个Observable。具体使用方法可以参考Javadoc文档。
串行化
如果你把 Subject 当作一个 Subscriber 使用,注意不要从多个线程中调用它的onNext方法(包括其它的on系列方法),这可能导致同时(非顺序)调用,这会违反Observable协议,给Subject的结果增加了不确定性。
要避免此类问题,你可以将 Subject 转换为一个 SerializedSubject ,类似于这样:
mySafeSubject = new SerializedSubject( myUnsafeSubject );
参考:
https://mcxiaoke.gitbooks.io/rxdocs/Single.html
https://mcxiaoke.gitbooks.io/rxdocs/Subject.html
http://reactivex.io/documentation/single.html
http://reactivex.io/documentation/subject.html
- RxJava之二——Single和Subject
- RxJava之Subject和Single
- rxjava(二)Single与Subject
- Rxjava分析—Subject
- Rxjava分析—Subject
- Rxjava分析—Subject
- RxJava—Subject系列
- Android--Rxjava分析—Subject
- RxJava之Subject
- Rxjava 之 Subject
- RxJava之Subject分类解析
- Android函数响应式编程——RxJava的4大subject和线程控制
- RxJava学习篇之一:基础Observable,Observer,Single,Subject,Scheduler
- RxJava-Subject
- RxJava 之二—— Lift()详解
- Rxjava Subject分析
- Rxjava Subject分析
- RxJava(RxAndroid)Subject学习
- 深度学习框架:tiny_dnn分析(2) ————分析sample代码
- android中使用Twitter登陆获取用户信息
- Handler,Lopper,Message,MessageQueue关系
- 浅析C语言的非局部跳转:setjmp和longjmp
- android7.x Launcher3源码解析(1)---启动流程
- RxJava之二——Single和Subject
- QT模态对话框与非模态对话框
- 方格取数 多线程动态规划
- Unity StartCoroutine 协同程序
- 实现底部导航栏中间凸起,(点击中间凸出按钮弹出菜单)
- 计蒜客 -- 求平方根
- MTCNN训练整理
- Windows+Eclipse+Maven+HBase 1.2.4开发环境搭建
- java异常总结