RxJava2(三)Subject和Processor

博客介绍了Subject和Processor相关知识。Subject既是Observable又是Observer,可发射订阅的数据,包含AsyncSubject、BehaviorSubject等4种类型,每种类型有不同的数据发射规则。Processor用法与Subject类似,但支持被压,也包含对应的4种类型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一, 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一样。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值