RX操作符之连接操作ConnectObservable(publish、connect、replay、refCount)

本文详细介绍了RxJava中ConnectableObservable的概念及其使用方法。包括如何通过publish操作符创建可连接的Observable,如何使用connect方法控制数据发射时机,replay操作符的作用以及refCount操作符的应用场景。

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

一、publish

将普通的Observable转换为可连接的Observable。可连接的Observable (connectable Observable)与普通的Observable差不多,不过它并不会在被订阅时开始发射数据,而是直到使用了Connect操作符时才会开始。用这种方法,你可以在任何时候让一个Observable开始发射数据。

 Observable<Long> observable = Observable.interval(1,TimeUnit.SECONDS).take(5);
        ConnectableObservable<Long>connectableObservable = observable.publish();

二、connect

调用该方法后ConnectObservable才会发射数据。普通的Observable如果被多次订阅,会订阅的一次整个生命周期完成之后再执行第二次订阅的内容。但是ConnectObservable订阅后会在Connect方法被调用后按发射的顺序执行。可连接的Observable (connectable Observable)与普通的Observable差不多,不过它并不会在被订阅时开始发射数据,而是直到使用了Connect操作符时才会开始。用这个方法,你可以等待所有的观察者都订阅了Observable之后再开始发射数据。

1.普通的Observable

Observable<Long> observable = Observable.interval(1,TimeUnit.SECONDS).take(5);

        Subscriber<Long> subscriber1 = new Subscriber<Long>() {
            @Override
            public void onNext(Long integer) {
                Log.e(TAG, "onNext1................." + integer);
            }

            @Override
            public void onCompleted() {
                Log.e(TAG, "onCompleted1.................");
            }

            @Override
            public void onError(Throwable e) {
                Log.e(TAG, "onError1.....................");
            }
        };

        Subscriber<Long> subscriber2 = new Subscriber<Long>() {
            @Override
            public void onNext(Long integer) {
                Log.e(TAG, "onNext2................." + integer);
            }

            @Override
            public void onCompleted() {
                Log.e(TAG, "onCompleted2.................");
            }

            @Override
            public void onError(Throwable e) {
                Log.e(TAG, "onError2.....................");
            }
        };

        observable.subscribe(subscriber1);
        observable.subscribe(subscriber2);


运行结果:


2.ConnectObservable发射的数据

Observable<Long> observable = Observable.interval(1,TimeUnit.SECONDS).take(5);
        ConnectableObservable<Long>connectableObservable = observable.publish();

        Subscriber<Long> subscriber1 = new Subscriber<Long>() {
            @Override
            public void onNext(Long integer) {
                Log.e(TAG, "onNext1................." + integer);
            }

            @Override
            public void onCompleted() {
                Log.e(TAG, "onCompleted1.................");
            }

            @Override
            public void onError(Throwable e) {
                Log.e(TAG, "onError1.....................");
            }
        };

        Subscriber<Long> subscriber2 = new Subscriber<Long>() {
            @Override
            public void onNext(Long integer) {
                Log.e(TAG, "onNext2................." + integer);
            }

            @Override
            public void onCompleted() {
                Log.e(TAG, "onCompleted2.................");
            }

            @Override
            public void onError(Throwable e) {
                Log.e(TAG, "onError2.....................");
            }
        };

        connectableObservable.subscribe(subscriber1);
        connectableObservable.subscribe(subscriber2);
        //必须执行此方法后才会发射数据
        connectableObservable.connect();

运行结果:


三、replay

如果在将一个Observable转换为可连接的Observable之前对它使用Replay操作符,产生的这个可连接Observable将总是发射完整的数据序列给任何未来的观察者,即使那些观察者在这个Observable开始给其它观察者发射数据之后才订阅。

四、refCount

将ConnectObservable转换成普通的Observalbe,当订阅被取消后重新订阅不会重新执行。让一个可连接的Observable表现得像一个普通的Observable

一个可连接的Observable与普通的Observable差不多,除了这一点:可连接的Observable在被订阅时并不开始发射数据,只有在它的connect()被调用时才开始。用这种方法,你可以等所有的潜在订阅者都订阅了这个Observable之后才开始发射数据。

 ConnectableObservable<Long>connectableObservable = Observable.interval(1,TimeUnit.SECONDS).take(5).publish();

        final Observable<Long> observable = connectableObservable.refCount().subscribeOn(Schedulers.newThread());

        final Subscriber<Long> subscriber1 = new Subscriber<Long>() {
            @Override
            public void onNext(Long integer) {
                Log.e(TAG, "onNext1................." + integer);
            }

            @Override
            public void onCompleted() {
                Log.e(TAG, "onCompleted1.................");
            }

            @Override
            public void onError(Throwable e) {
                Log.e(TAG, "onError1.....................");
            }
        };

        Subscriber<Long> subscriber2 = new Subscriber<Long>() {
            @Override
            public void onNext(Long integer) {
                Log.e(TAG, "onNext2................." + integer);
                if(integer == 1){
                    subscriber1.unsubscribe();
                }else if(integer == 3){
                    observable.subscribe(subscriber1);
                }
            }

            @Override
            public void onCompleted() {
                Log.e(TAG, "onCompleted2.................");
            }

            @Override
            public void onError(Throwable e) {
                Log.e(TAG, "onError2.....................");
            }
        };

        observable.subscribe(subscriber2);
        observable.subscribe(subscriber1);

运行结果:




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值