Connect
Publish操作符将原有的Observable转化为ConnectableObservable,ConnectableObservable在被订阅的时候不会发射数据,而是在调用Connect操作符时才发射数据。Connect操作符会生成Subscription对象,如果想终止数据的发射,调用unsubscribe即可。如果一个Observable没有订阅着订阅它,可以使用Connect操作符让Observable发射数据。
原理图如下:
Connect操作符使用如下:
private Action1<Long> mAction1;
private Action1<Long> mAction2;
@Override
protected void createObservable() {
super.createObservable();
isConnect = true;
createAction1();
createAction2();
mObservable = Observable.interval(1, TimeUnit.SECONDS)
.observeOn(AndroidSchedulers.mainThread())
.publish();
mObservable.subscribe(mAction1);
}
private void createAction1() {
mAction1 = new Action1<Long>() {
@Override
public void call(Long integer) {
displayLogcat("createAction1 call integer = " + integer);
if (integer == 3) {
mObservable.subscribe(mAction2);
}
}
};
}
private void createAction2() {
mAction2 = new Action1<Long>() {
@Override
public void call(Long integer) {
displayLogcat("createAction2 call integer = " + integer);
}
};
}
运行代码,结果如下:
RefCount
RefCount操作符是将一个ConnectableObservable转换为一个普通的Observable,并通过订阅者的订阅,将数据发送出去。原理图如下:
RefCount操作符使用如下:
@Override
protected void createObservable() {
super.createObservable();
mObservable = Observable.just(1, 2, 3, 4, 5, 6, 7, 8, 9)
.publish()
.refCount();
}
运行代码,结果如下:
Replay
Replay操作符返回一个ConnectableObservable对象并且可以缓存其发射过的数据,这样即使有订阅者在其发射数据之后进行订阅也能收到其之前发射过的数据。不过使用Replay操作符我们最好还是限定其缓存的大小,否则缓存的数据太多了可会占用很大的一块内存。对缓存的控制可以从空间和时间两个方面来实现。原理图如下:
Replay操作符使用如下:
private Action1<Long> mAction1;
private Action1<Long> mAction2;
@Override
protected void createObservable() {
super.createObservable();
isConnect = true;
createAction1();
createAction2();
mObservable = Observable.interval(1, TimeUnit.SECONDS)
.observeOn(AndroidSchedulers.mainThread())
.replay(3);
// .replay(3, TimeUnit.SECONDS);
mObservable.subscribe(mAction1);
}
private void createAction1() {
mAction1 = new Action1<Long>() {
@Override
public void call(Long integer) {
displayLogcat("createAction1 call integer = " + integer);
if (integer == 3) {
mObservable.subscribe(mAction2);
}
}
};
}
private void createAction2() {
mAction2 = new Action1<Long>() {
@Override
public void call(Long integer) {
displayLogcat("createAction2 call integer = " + integer);
}
};
}
运行代码,结果如下:
接下来就是鸣谢了,非常感谢以下两位博主,相关链接如下:https://mcxiaoke.gitbooks.io/rxdocs/content/operators/Connectable-Observable-Operators.html
http://mushuichuan.com/2015/12/11/rxjava-operator-9/
github地址