前言:
笔者写这些东西,只是笔者的学习积累,也就是笔记吧。希望可以帮助各位看客,接收各种批评建议。下面进入 延时 类操作符
正文:
1、defer 操作符
1)、作用
当有观察者 进行了注册之后 才进行发送事件;
每次创建的 被观察者 均不相同 即为最新创建的被观察者对象
2)、代码
private int i = 0;
/**
* defer() 操作符
*/
private void deferMethod(final int i) {
final Observable<Integer> observable = Observable.defer(new Callable<ObservableSource<? extends Integer>>() {
@Override
public ObservableSource<? extends Integer> call() throws Exception {
//打印 是否发送数据
logDUtils("ObservableSource:" + i);
return Observable.just(i);
}
});
//每次 打印 被观察者的 hashCode 虽然 hashCode 不能标定 是否对象相同, 但是是一个间接的因素,测试可以直接打印 被观察者对象即可
//打印hashCode 只为了 日志好看。。。
logDUtils(observable.hashCode() + "");
// 当 i >= 3 创建观察者
if (i >= 3) {
observable.subscribe(new Observer<Integer>() {
@Override
public void onSubscribe(Disposable d) {
logDUtils("onSubscribe:");
}
@Override
public void onNext(Integer integer) {
logDUtils("onNext:" + integer);
}
@Override
public void onError(Throwable e) {
logDUtils("onError:" + e.getMessage());
}
@Override
public void onComplete() {
logDUtils("onComplete:");
}
});
}
if (i == 5) {
logDUtils("---------------------------------------------------");
}
}
//每次点击按钮 i 自加
public void doClick(View v) {
i++;
logDUtils("传入i: " + i);
deferMethod(i);
}
3)、效果演示
每次点击 按钮 i 自加 ,都会创建一个 observable 对象,但是不会发送数据,直到 产生了订阅关系 ,才会发送数据,并且处理数据。而且每次 处理完成就结束该事件。
2、timer 操作符
1)、作用
创建1个被观察者对象
延迟指定时间后 发送数据 、接收处理 。默认情况下只发送一次。
2)、代码
/**
* timer 操作符
*/
private void timerMethod() {
final long[] a = {0};
final long[] b = {0};
Observable.timer(10, TimeUnit.SECONDS)
.subscribe(new Observer<Long>() {
@Override
public void onSubscribe(Disposable d) {
a[0] = System.currentTimeMillis();
logDUtils("onSubscribe");
}
@Override
public void onNext(Long aLong) {
logDUtils("onSubscribe" + aLong);
}
@Override
public void onError(Throwable e) {
logDUtils("onError" + e.getMessage());
}
@Override
public void onComplete() {
b[0] = System.currentTimeMillis();
logDUtils("程序执行时间: " + (b[0] - a[0]) + " 毫秒");
logDUtils("onComplete");
}
});
}
3)、运行效果
timer 默认是 运行在 自己的线程的,可以查看一下源码啥的;
但是 timer 有两个独立的方法
分别是:
public static Observable<Long> timer(long delay, TimeUnit unit)
public static Observable<Long> timer(long delay, TimeUnit unit, Scheduler scheduler)
第二个方法可以 程序员自己进行定义相关的 调度器。
3、interval 操作符
1)、作用
创建1个被观察者对象
每隔指定时间就发送事件 (定时器)
2)、代码
/**
* interval 操作符
*/
private void intervalMethod() {
Observable.interval(5, TimeUnit.SECONDS).subscribe(new Observer<Long>() {
@Override
public void onSubscribe(Disposable d) {
logDUtils("onSubscribe:");
}
@Override
public void onNext(Long aLong) {
logDUtils("onNext:" + aLong);
}
@Override
public void onError(Throwable e) {
logDUtils("onError:" + e.getMessage());
}
@Override
public void onComplete() {
logDUtils("onComplete");
}
});
}
3)、效果
该操作符有以下几个方法
//参数:时间间隔 单位
public static Observable<Long> interval(long period, TimeUnit unit)
//参数:时间间隔 单位 自定义调度器
public static Observable<Long> interval(long period, TimeUnit unit, Scheduler scheduler)
//参数:初始延迟时间 时间间隔 单位
public static Observable<Long> interval(long initialDelay, long period, TimeUnit unit)
//参数:初始延迟时间 时间间隔 单位 自定义调度器
public static Observable<Long> interval(long initialDelay, long period, TimeUnit unit, Scheduler scheduler)
4、intervalRange 操作符
1)、作用
创建1个被观察者对象
每隔指定时间 发送 事件,可以指定发送的数据的数量
类似于 interval 操作符 但是可以指定 发射的 数据数量以及开始的事件
2)、代码
/**
* intervalRange 操作符
*/
private void intervalRangeMethod() {
Observable.intervalRange(9, 2, 5, 5, TimeUnit.SECONDS)
.subscribe(new Observer<Long>() {
@Override
public void onSubscribe(Disposable d) {
logDUtils("onSubscribe:");
}
@Override
public void onNext(Long aLong) {
logDUtils("onNext:" + aLong);
}
@Override
public void onError(Throwable e) {
logDUtils("onError:" + e.getMessage());
}
@Override
public void onComplete() {
logDUtils("onComplete");
}
});
}
3)、效果
该操作符有两个方法
//参数:开始事件是哪个 发送事件个数 开始发送时间延迟 事件之间的时间间隔 单位
public static Observable<Long> intervalRange(long start, long count, long initialDelay, long period, TimeUnit unit)
//参数:开始事件是哪个 发送事件个数 开始发送时间延迟 事件之间的时间间隔 单位 自定义调度器
public static Observable<Long> intervalRange(long start, long count, long initialDelay, long period, TimeUnit unit, Scheduler scheduler)
5、range 操作符
1)、作用
创建1个被观察者对象(
连续发射 指定范围内的 事件序列 可以指定开始 事件位置
2)、代码
/**
* range 操作符
*/
private void rangeMethod() {
Observable.range(4, 3).subscribe(new Observer<Integer>() {
@Override
public void onSubscribe(Disposable d) {
logDUtils("onSubscribe:");
}
@Override
public void onNext(Integer integer) {
logDUtils("onNext:" + integer);
}
@Override
public void onError(Throwable e) {
logDUtils("onError:" + e.getMessage());
}
@Override
public void onComplete() {
logDUtils("onComplete");
}
});
}
3)、效果
参数:从4事件开始 发射3个事件
6、rangeLong 操作符
1)、作用
类似于 range 操作符,只是该操作符 支持了 long 类型数据