打造RxJava生命周期管理框架RxLife

在前边RxJava实战技巧大全一文中,我们介绍了RxJava使用过程中常见的应用场景和可能遇到的问题,其中我们谈到利用RxLifeCycle来管理RxJava的生命周期,避免内存泄漏问题,今天自己动手打生命周期管理框RxLife来加深对RxJava的认识。


详解Subject

什么是Subject

在RxJava当中,有四个对象值得我们关注:Observable,Subject,Observer,Subscriber,它们之间的关系如下:
这里写图片描述

对于Observable,Observer,Subscriber我们比较熟悉,故不做说明,重点来看Subject。

通过上面的图我们可以看出Subject继承自Observable,也就意味着Subject可以作为被观察者,另外,它又实现了Observer接口,这意味着它也可以作为观察者。不难看出,Subject既能作为Observer订阅Observable,又能作为Observable被其他Observer订阅。总之,Subject承担了这么一种角色:对上作为观察者,对下作为被观察者。

和Observable必须有订阅者才能发射数据不一样,无论Subject是否有订阅者,它都可以发射数据。这有点类似广播电台,不会因为我们关闭收音机就停止广播,在收听的人自然收听的到,没收听的人也无关紧要。

常见的Subject

从上面的uml中我们看出,RxJava为我们提供了四种常用的Subject,即
AsyncSubject,BehabviorSubject,PublishSubject,ReplaySubject,下面我们对这四者进行说明:

AsyncSubject

AsyncSubject会缓存最后一个数据并在调用onCompleted()时将该数据发送给订阅者,原理如下:
这里写图片描述

在该过程中,一旦发生任何异常都不会发送数据到订阅者,而是发送给订阅者一个异常通知,即订阅者只能接受到一个异常的通知,如下:
这里写图片描述

举例来说明AsyncSubject的用法:

asyncSubject.onNext("1");
asyncSubject.onNect("2");
asyncSubject.onCompleted();//必须调用才会开始发送数据

以上代码执行后,订阅者接受到的数据是2.

BehaviorSubject

当BehaviorSubject被订阅后,它首先会发送原始Observable最近发射的数据,如果最近没有,会发射一个默认值,接下继续发射原始Observable的数据,如下图:
这里写图片描述

如果原始的Observable因为发生了错误而终止,那么BehaviorSubject在发送一个错误通知后不再发射数据,如下:
这里写图片描述

我们举例来说明BehabviorSubject的用法:

behaviorSubject.onNext("1");
behaviorSubject.onNect("2");
behaviorSubject.onNext("3");
behaviorSubject.subscribe(new Action<String>(){
    @Override
    public void call(String s){
        System.out.println(“result:”+s);
    }
});
behaviorSubject.onNext("4");

输出结果是3,4.

PublishSubject

默认情况下,RxJava中的Observable一旦被订阅就开始发送事件,这和我们传统的观察者模式有所区别。而PublishSuject的行为则类似传统的观察这模式,观察者可以先订阅被观察者,然后在某个时刻手动调用方法来发射数据(订阅之后的数据)到所有的观察者。如下图:
这里写图片描述

如果原始的Observable因为发生了错误而终止,那么PublishSubject在发送一个错误通知后不再发射数据,如下:
<

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值