RxJava—Subject系列

RxJava—Subject系列

Subject是Observable的子类,虽然它自己没啥子用,但它有很多牛逼的儿子,我们统称为Subject系列,在继承父类的基础上,它们本身也有了很多强悍的功能,最牛逼的是它可以订阅多个观察者,也就是它可以一对多,可以让多个观察者来订阅(注册),这样你就可以针对同一组消息序列做不同的操作,且相互独立。其次它跟Observable还有一个明显区别,就是它是属于冷更新,上一章有讲到,Observable的消息序列在有观察者Observer订阅的时候就会立马将消息发送给观察者,属于热更新,而Subject的儿子们就比较拽,有观察者订阅(注册)并不会立马发送消息序列,而是需要手动调用onNext方法发送消息序列,想发才发,这样更加灵活。

为了激发你们的阅读动力,还是先贴图:提供demo下载
点击N次,则是注册N个观察者,Clear按钮的作用是清空所有注册的观察者(解除订阅),同样发送消息两个观察者也会同时收到。图看不明白可以下载demo细细看,开发软件是AS,有详细注释。
RxJava—Subject系列_第1张图片


一、Subject—PublishSubject

PublishSubject,当观察者注册时并不会发送消息,且可以注册多个观察者(框架中会将每一个注册的观察者缓存),当手动调用onNext方法发送消息时,所有观察者都能同时受到消息,基本使用代码如下:

    publishSubject = PublishSubject.create();
    subscription = publishSubject.subscribe(new Observer() {
                    @Override
                    public void onCompleted() {
                        String info = " Observer onCompleted";
                        adapter.add(info);
                    }
                    @Override
                    public void onError(Throwable e) {
                    }
                    //观察者接收数据
                    @Override
                    public void onNext(String item) {
                        itemId++;
                        String info;
                        info = itemId + " Observer " + "accept info is " + item;
                        if (adapter != null) {
                            adapter.add(info);
                        }
                    }
                });
      //发送消息
      publishSubject.onNext("pdm的publishSubject消息"); 
      //取消订阅
      subscription.unsubscribe(); 

二、Subject—BehaviorSubject

基本的使用方法跟PublishSubject一致,唯一区别的地方是BehaviorSubject在创建的时候可以指定一条默认消息(默认为null),一旦有观察者订阅(注册),则会将这条消息发给观察者。创建方法如下(订阅方式跟PublishSubject一样):

    behaviorSubject = BehaviorSubject.create("pdm默认发送消息");

三、Subject—ReplaySubject

基本使用方法跟PublishSubject一致,唯一区别在于它能缓存发送过的消息,好处就是后面订阅的观察者都能收到前面订阅(注册)观察者收到的所有消息(默认最多16条,这个也可以在创建时设置,理论上没有条数限制),代码部分因为跟PublishSubject基本一样,改个类名就行,就不贴了。

四、Subject—AsyncSubject

基本使用方法跟PublishSubject一致,区别有两点,第一点:AsyncSubject发送消息调用onNext方法后,必须调用onCompleted方法,否则消息发不出去;第二点:AsyncSubject注册的观察者能且只能收到一条消息,且是最新的那条消息,也就是你发了4条消息,实际它只能收到第四条消息,而且后面有观察者订阅的时候会立马收到这条消息,且这个观察者非常悲剧,因为它已经收到了一条消息,所以它连发送消息的权利也被剥夺了。代码如下:

    asyncSubject = AsyncSubject.create();
    subscription = asyncSubject.subscribe(new Observer() {
                    @Override
                    public void onCompleted() {
                        String info = " Observer onCompleted";
                        adapter.add(info);
                    }
                    @Override
                    public void onError(Throwable e) {
                    }
                    //观察者接收数据
                    @Override
                    public void onNext(String item) {
                        itemId++;
                        String info;
                        info = itemId + " Observer " + "accept info is " + item;
                        if (adapter != null) {
                            adapter.add(info);
                        }
                    }
                });
     asyncSubject.onNext("pdm的asyncSubject消息");
     asyncSubject.onNext("baobao的asyncSubject消息");
     //实际有效消息就这一条,上面的都是废弃的消息
     asyncSubject.onNext("chenglong的asyncSubject消息");
     asyncSubject.onCompleted();
     //取消订阅
     subscription.unsubscribe(); 

讲到这里,这一章节就告一段落了,下面的章节将重点讲述RxJava的常用操作符,分成三大类(过滤、合并、转换)。
当然还有不能错过的demo下载:RxJava_Demo

你可能感兴趣的:(RxJava,RxJava探索)