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

来源:互联网 发布:出租屋装修知乎 编辑:程序博客网 时间:2024/05/16 19:04

一、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);

运行结果:




0 0
原创粉丝点击