一、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);
运行结果: