各位看官们大家好,上一回中咱们说的例子是"RxJava中的多线程切换",本章回中介绍的例子是" RxJava中的timer"。闲话休提,言归正转,让我们一起Talk Android吧!
概念介绍
我们在前面章回中介绍了RxJava中线程相关的内容,本章回中将介绍与timer相关的内容,这里说的timer主要指延时和定时发送事件。这些操作也是通过操作符完成
的,与这些操作相关的操作符为timer
和interval
.
使用方法
- 操作符timer表示延时(delay)发送事件,延长的时间通过该方法的参数指定,第一个参数为时间值,第二个参数为时间单位;
- 操作符interval表示每隔一段时间定期发送事件,时间通过该方法的参数指定,第一个参数为时间值,第二个参数为时间单位;注意:发送事件一直运行,不会主动停止。
示例代码
- timer示例
Log.d(TAG, "rxJavaEx: start: "+System.currentTimeMillis());
Disposable disposable = Observable.timer(2,TimeUnit.SECONDS)
.subscribe(new Consumer<Long>() {
@Override
public void accept(Long aLong) throws Throwable {
Log.d(TAG, "accept end: "+" "+System.currentTimeMillis());
}
});
try {
TimeUnit.SECONDS.sleep(3);
if(disposable !=null && !disposable.isDisposed())
disposable.dispose();
} catch (InterruptedException e) {
e.printStackTrace();
}
在上面的代码中,我们通过timer操作符设定了一个2s延时,为了验证延时是否有效,我们在发送事件前和收到事件后分别打印了系统当前的时间,程序运行结果如下:
rxJavaEx: start: 1680530167569
rxJavaEx: accept end: 1680530169580
从上面的运行结果中可以看到start与end的时间差接近2s,这表明程序中的延时有效果。
- interval示例
Disposable disposable = Observable.interval(1,TimeUnit.SECONDS)
.subscribe(new Consumer<Long>() {
@Override
public void accept(Long aLong) throws Throwable {
Log.d(TAG, "accept time: "+aLong);
}
});
try {
TimeUnit.SECONDS.sleep(3);
if(disposable !=null && !disposable.isDisposed()){
disposable.dispose();
disposable = null;
Log.d(TAG, "rxJavaEx: stop timer");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
在上面的代码中,我们通过interval
操作符设定了一个1s的间隔时间,程序会每隔1s发送一次事件。为了方便分析,我们把发送的事件,也就是时间值(参数aLaong中
的值)打印出来。因为发送事件一直在进行,我们让主程序等待3s,然后停止发送事件。编译并且运行上面的程序,可以得到以下结果:
rxjava: accept time: 0
rxjava: accept time: 1
rxjava: rxJavaEx: stop timer
从上面的程序运行结果中可以看到,被观察者每隔1s发送一次事件,到第3s秒时,我们在主程序中主动停止发送事件。
经验总结
timer
和interval
这两个操作符发送的事件是固定的,事件值为从0开始的数字,每发送一次递增一次。因此我们无法指定事件的内容,同时我们也不能手动发送事件,
事件内容是Long类型的数值,观察者中的参数需要与此类型保持一致。
我们总结为:使用timer和interval这两个操作符时,被观察者的类型,事件类型以及事件内容都是固定的,观察者的类型需要与被观察者保持一致。
与前面章回中的其它操作符相比,我们不能灵活使用被观察者和观察者,以及被观察者发送的事件。
看官们,关于"RxJava中的timer"的例子咱们就介绍到这里,欲知后面还有什么例子,且听下回分解!