RxJava2(三)Subject和Processor

一, Subject
它既是一个Observable可不断调用onNext发射数据,直到遇到onComplete结束,又是一个Observer可订阅数据。它可以将订阅的数据作为自己的数据发射出去。

包含4种类型:AsyncSubject,BehaviorSubject,ReplaySubject,PublishSubject。

AsyncSubject
观察者/订阅者只会接受到onComplete之前的最后一个数据。

AsyncSubject<Integer> subject = AsyncSubject.create();
        subject.onNext(0);
        subject.onNext(1);
        subject.onNext(2);
        subject.onComplete();
        subject.subscribe(new Observer<Integer>() {
            @Override
            public void onSubscribe(Disposable d) {

            }

            @Override
            public void onNext(Integer integer) {
                Log.d(TAG, "onNext: " + integer);
                Toast.makeText(MainActivity.this, integer, Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onError(Throwable e) {
                Log.d(TAG, "onError: " + e.getMessage());
            }

            @Override
            public void onComplete() {
                Log.d(TAG, "onComplete" );
            }
        });
    }



执行结果:onNext: 2

BehaviorSubject
观察者/订阅者会收到订阅之前的最后一个数据,再继续接受之后发射过来的数据,若BehaviorSubject订阅之前未发射过数据,则发射一个默认值。

  BehaviorSubject<Integer> subject = BehaviorSubject.createDefault(9);

        subject.subscribe(new Consumer<Integer>() {
            @Override
            public void accept(Integer integer) throws Exception {
                Log.d(TAG, "accept: " + integer);
            }
        }, new Consumer<Throwable>() {
            @Override
            public void accept(Throwable throwable) {

            }
        }, new Action() {
            @Override
            public void run() throws Exception {
                Log.d(TAG, "run: onComplete");
            }
        });
        subject.onNext(0);
        subject.onNext(1);
        subject.onComplete();



输出结果:
accept:9
accept:0
accept:1
run: onComplete

ReplaySubject
1.无论何时订阅,都将发射所有的原始数据给订阅者。

ReplaySubject subject = ReplaySubject.create();

2.缓存n条数据,当订阅时只发送缓存过的数据和之后数据。

 ReplaySubject subject = ReplaySubject.createWithSize(2);
        subject.onNext(0);
        subject.onNext(1);
        subject.onNext(3);
        subject.onNext(4);
        subject.onNext(5);

        subject.subscribe(new Consumer<Integer>() {
            @Override
            public void accept(Integer integer) throws Exception {
                Log.d(TAG, "accept: " + integer);
            }
        }, new Consumer<Throwable>() {
            @Override
            public void accept(Throwable throwable) {

            }
        }, new Action() {
            @Override
            public void run() throws Exception {
                Log.d(TAG, "run: onComplete");
            }
        });
        subject.onNext(6);
        subject.onNext(7);
        subject.onComplete();



输出结果:
accept: 4
accept: 5
accept: 6
accept: 7
run: onComplete

PublishSubject
观察者只接受PublishSubject订阅之后的数据。

PublishSubject subject = PublishSubject.create();
        subject.onNext(0);
        subject.onNext(1);

        subject.subscribe(new Consumer<Integer>() {
            @Override
            public void accept(Integer integer) throws Exception {
                Log.d(TAG, "accept: " + integer);
            }
        }, new Consumer<Throwable>() {
            @Override
            public void accept(Throwable throwable) {

            }
        }, new Action() {
            @Override
            public void run() throws Exception {
                Log.d(TAG, "run: onComplete");
            }
        });
        subject.onNext(3);
        subject.onNext(4);



输出结果:
accept: 3
accept: 4

二,Processor
Processor和Subject用法一样,只是Processor支持被压。
它也包含4中类型:AsyncProcessor, BehaviorProcessor,ReplayProcessor,PublishProcessor。
用法同Subject一样。
 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值