RxJava之PublishSubject、BehaviorSubject、ReplaySubject和AsyncSubject

本文深入探讨了RxJava中的四种主题(PublishSubject, BehaviorSubject, ReplaySubject, AsyncSubject)的工作原理及特性,通过具体示例展示了不同主题如何处理消息的发送与接收,帮助读者理解何时选用哪种主题。

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

 
public class T2 {

    /**
     * subject 是一个神奇的对象,它可以是一个Observable同时也可以是一个Observer:它作为连接这两个世界的一座桥梁。
     * 一个主题可以订阅一个Observable,就像一个观察者,并且它可以发射新的数据,或者传递它接受到的数据,就像一个Observable。
     * 很明显,作为一个Observable,观察者们或者其它主题都可以订阅它。
     * 串行化如果你把 Subject 当作一个 Subscriber 使用,注意不要从多个线程中调用它的onNext方法(包括其它的on系列方法),
     * 这可能导致同时(非顺序)调用,这会违反Observable协议,给Subject的结果增加了不确定性。
     * 要避免此类问题,你可以将 Subject 转换为一个 SerializedSubject ,类似于这样:
     * mySafeSubject = new SerializedSubject( myUnsafeSubject );
     */
    public static void main(String[] args) {
        T2 t2 = new T2();
        System.out.println("===================testPublishSubject==========================");
        t2.testPublishSubject();
        System.out.println("===================testBehaviorSubject==========================");
        t2.testBehaviorSubject();
        System.out.println("===================testReplaySubject==========================");
        t2.testReplaySubject();
        System.out.println("===================testAsyncSubject==========================");
        t2.testAsyncSubject();

    }

    /*
    PublishSubject的观察者接收到的是后续的消息
    输出为:===================testPublishSubject==========================
    observer1 - A	observer1 - B	observer1 - C	observer2 - C	observer1 - D	observer2 - D	onCompleted
    onCompleted
    * */
    private void testPublishSubject() {
        Observer<String> observer1 = new Observer<String>() {

            @Override
            public void onNext(String t) {
                System.out.print("observer1 - " + t + "\t");
            }

            @Override
            public void onCompleted() {
                System.out.println("onCompleted");
            }

            @Override
            public void onError(Throwable e) {
                System.out.println(e.getMessage());
            }

        };

        Observer<String> observer2 = new Observer<String>() {

            @Override
            public void onNext(String t) {
                System.out.print("observer2 - " + t + "\t");
            }

            @Override
            public void onCompleted() {
                System.out.println("onCompleted");
            }

            @Override
            public void onError(Throwable e) {
                System.out.println(e.getMessage());
            }

        };
        PublishSubject<String> publishSubject = PublishSubject.create();
        publishSubject.subscribe(observer1);
        publishSubject.onNext("A");
        publishSubject.onNext("B");
        publishSubject.subscribe(observer2);
        publishSubject.onNext("C");
        publishSubject.onNext("D");
        publishSubject.onCompleted();
        System.out.println();
    }

    /** BehaviorSubject的观察者接收到的永远是最近的消息 和后续的消息
     * 输出为===================testBehaviorSubject==========================
     * default	A	B	C
     * B	C	D
     * onCompleted
     * error
     * */
    private void testBehaviorSubject() {
        Observer<String> observer = new Observer<String>() {

            @Override
            public void onNext(String t) {
                System.out.print(t + "\t");
            }

            @Override
            public void onCompleted() {
                System.out.println("onCompleted");
            }

            @Override
            public void onError(Throwable e) {
                System.out.println(e.getMessage());
            }

        };

        //收到所有消息
        BehaviorSubject<String> subject1 = BehaviorSubject.create("default");
        subject1.subscribe(observer);
        subject1.onNext("A");
        subject1.onNext("B");
        subject1.onNext("C");
        System.out.println();

        //不能收到default、A
        BehaviorSubject<String> subject2 = BehaviorSubject.create("default");
        subject2.onNext("A");
        subject2.onNext("B");
        subject2.subscribe(observer);
        subject2.onNext("C");
        subject2.onNext("D");
        System.out.println();

        //只能收到onCompleted
        BehaviorSubject<String> subject3 = BehaviorSubject.create("default");
        subject3.onNext("A");
        subject3.onNext("B");
        subject3.onCompleted();
        subject3.subscribe(observer);
        System.out.println();

        // 只能收到error
        BehaviorSubject<String> subject4 = BehaviorSubject.create("default");
        subject4.onNext("A");
        subject3.onNext("B");
        subject4.onError(new RuntimeException("error"));
        subject4.subscribe(observer);

        System.out.println();
    }

    /** ReplaySubject会缓存所有消息,所以观察者都会收到所有消息
     * 输出:===================testReplaySubject==========================
     * A	B	A	B	C	C	D	D	onCompleted
     * onCompleted
     * */
    private void testReplaySubject() {
        Observer<String> observer1 = new Observer<String>() {

            @Override
            public void onNext(String t) {
                System.out.print(t + "\t");
            }

            @Override
            public void onCompleted() {
                System.out.println("onCompleted");
            }

            @Override
            public void onError(Throwable e) {
                System.out.println(e.getMessage());
            }

        };

        Observer<String> observer2 = new Observer<String>() {

            @Override
            public void onNext(String t) {
                System.out.print(t + "\t");
            }

            @Override
            public void onCompleted() {
                System.out.println("onCompleted");
            }

            @Override
            public void onError(Throwable e) {
                System.out.println(e.getMessage());
            }

        };
        ReplaySubject<String> publishSubject = ReplaySubject.create();
        publishSubject.subscribe(observer1);
        publishSubject.onNext("A");
        publishSubject.onNext("B");
        publishSubject.subscribe(observer2);
        publishSubject.onNext("C");
        publishSubject.onNext("D");
        publishSubject.onCompleted();
        System.out.println();
    }

    /**当Observable完成时AsyncSubject只会发布最后一条消息给已经订阅的每一个观察者,
     * 如果没有调用onCompleted则被观察者不会发送任何消息给观察者
     * 输出===================testAsyncSubject==========================
     * C	onCompleted
     * */
    private void testAsyncSubject() {
        Observer<String> observer = new Observer<String>() {

            @Override
            public void onNext(String t) {
                System.out.print(t + "\t");
            }

            @Override
            public void onCompleted() {
                System.out.println("onCompleted");
            }

            @Override
            public void onError(Throwable e) {
                System.out.println(e.getMessage());
            }
        };

        AsyncSubject<String> publishSubject1 = AsyncSubject.create();
        publishSubject1.subscribe(observer);
        publishSubject1.onNext("A");
        publishSubject1.onNext("B");
        publishSubject1.onNext("C");

        AsyncSubject<String> publishSubject2 = AsyncSubject.create();
        publishSubject2.subscribe(observer);
        publishSubject2.onNext("A");
        publishSubject2.onNext("B");
        publishSubject2.onNext("C");
        publishSubject2.onCompleted();
        System.out.println();
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值