在前边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在发送一个错误通知后不再发射数据,如下:
<