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();
调用该方法后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);
运行结果:
- RX操作符之连接操作ConnectObservable(publish、connect、replay、refCount)
- RX操作符之辅助操作一(materialize、dematerialize、timestamp、serialize、replay、observeOn、subscribeon、dooneach)
- Rx操作符 参考
- Rx常用操作符
- Connect 连接操作
- RX操作符之辅助操作符三(using、getIterator、toFuture、toIterator、toMap、toMultiMap、nest)
- RX操作符之过滤操作二(firstOrDefault、single、elementAt、sample、throttleFirst、throwttleLast、throttleWithTimeout)
- RX操作符之结合操作(startWith、merge、mergeDelayError、zip、join、groupjoin、switchOnNext)
- RX操作之辅助操作符二(doonunsubscribe、doOnCompleted、doOnError、doOnTerminate、finallyDo、delay、delaySubscription)
- RX操作符之对Observable发射的数据执行变换操作一(map、flatmap)
- Rx 入门(五)-- 转换操作符
- RX操作符之字符串操符StringObservable 类(byLine、decode、encode、join、split、stringConcat)
- RX操作符之Observable的创建方式一(just、from、repeat、repeatWhen)
- RX操作符之错误处理(catch[onErrorReturn、onErrorResumeNext、onExceptionResumeNext]、retry、retryWhen)
- RX操作符之Observable的创建方式一(just、from、repeat、repeatWhen)
- RX操作符之对Observable发射的数据执行变换操作一(map、cast、flatmap、flatmapiteriable、switchmap)
- RX操作符之对Observable发射的数据执行变换操作二(scan、groupby、buffer、window)
- RX操作符之过滤操作一(debounce、filter、ofType、takeLast、last、lastOrDefault、takeLastBuffer、skip、skipLast、take)
- WindowManager窗口管理
- linux系统如何破解密码
- C++封装、继承、多态
- google test 学习笔记2-google test Advanced guide
- 组合模式
- RX操作符之连接操作ConnectObservable(publish、connect、replay、refCount)
- VS2010/MFC编程入门之十一(对话框:模态对话框及其弹出过程)
- IT--ganglia--报错
- Cubemap
- continue 的理解
- web前端选项卡的写法
- gulp教程之gulp-less
- 为什么Java byte 类型的取值范围是-128~127
- 跳槽与最近