ReactiveX通过使用可观察序列来编写异步和基于事件程序的库。它扩展了观察者模式以支持数据和/或事件序列,并增加了运算符,使您可以声明性地组合序列,同时抽象出对低级线程,同步,线程安全性,并发数据结构和非线程等事物的关注阻塞I / O。
- defer
直到有订阅者才创建observable,并且为每个订阅者创建一个全新的observable。
defer 操作符返回一个Observable,它调用ObservableSource工厂为每个订阅的新Observer创建一个ObservableSource。 也就是说,对于每个订户,订户观察的实际ObservableSource由工厂函数确定。
示例代码:创建defer和just操作符。
private Observable<Long> defer = getDefer();
private Observable<Long> just = getJust();
public Observable getDefer() {
return Observable.defer(new Callable<ObservableSource<Long>>() {
@Override
public ObservableSource<Long> call() throws Exception {
return getJust();
}
});
}
private Observable getJust() {
return Observable.just(System.currentTimeMillis());
}
public void subscribe() {
just.subscribe(new Consumer<Long>() {
@Override
public void accept(Long o) throws Exception {
System.out.println("just" + o);
}
});
defer.subscribe(new Consumer<Long>() {
@Override
public void accept(Long o) throws Exception {
System.out.println("defer" + o);
}
});
}
测试代码
@Test
public void testDefer() {
Defer defer = new Defer();
defer.subscribe();
sleep(100);
defer.subscribe();
sleep(100);
defer.subscribe();
}
打印结果:
just1553737935714
defer1553737935730
just1553737935714
defer1553737935840
just1553737935714
defer1553737935949
defer每次订阅都会得到一个全新的数据,在某些情况下,直到最后订阅发生时,才生产Observable,确保数据是最新的。而just每次等到的数据都是一样的,说明just在每次订阅前不会得到最新的数据。
延迟Observer允许您推迟或延迟ObservableSource中的发射项,直到Observer订阅ObservableSource为止。 这允许Observer轻松获取序列的更新或刷新版本。
- interval
创建一个按固定时间间隔发射整数序列的Observable。
inteirval操作符返回一个observable,他按固定的时间间隔发射一个无限递增的整数序列
inteirval重载四个方法。
//初始延时时间,间隔时间,表示时间的单位,调度程序
Observable<Long> interval(long, long, TimeUnit)
//初始延时时间,间隔时间,表示时间的单位,调度程序
Observable<Long> interval(long, long, TimeUnit, Scheduler)
//间隔时间,表示时间的单位,
Observable<Long> interval(long, TimeUnit)
//间隔时间,表示时间的单位,调度程序
Observable<Long> interval(long, TimeUnit, Scheduler)
实例代码(1):
public void interval() {
Observable.interval(1, TimeUnit.SECONDS)
.subscribe(new Consumer<Long>() {
@Override
public void accept(Long aLong) throws Exception {
System.out.println(aLong);
}
});
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
创建一个按固定时间间隔发射整数序列的Observable。上述代码中,每个1s中发送一个整型数据,从0到9截止。
实例代码(2):
public void intervalInitialDelay() {
Observable.interval(10, 1, TimeUnit.SECONDS)
.subscribe(new Consumer<Long>() {
@Override
public void accept(Long aLong) throws Exception {
System.out.println(aLong);
}
});
try {
Thread.sleep(20000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
延迟十秒钟后,每个1s发送整型数据,到9截止。
- timer
创建一个observable,他在一个给定的延迟后发射一个特殊的值0
实例代码:
public void timer(){
Observable.timer(5, TimeUnit.SECONDS)
.subscribe(new Consumer<Long>() {
@Override
public void accept(Long aLong) throws Exception {
System.out.println(aLong);
}
});
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
10s中后发射一个数据,该数据为0。
timer操作符创建一个在给定的时间段之后返回一个特殊值的Observable。
timer返回一个Observable,他在延迟一段时间后发射一个简单的数字0,timer操作符默认在computation调度器上执行。