1.Timer:创建一个延时的Obsevable发送给观察者,即延时一段时间做某事
LogUtils.e("开始");
Observable.timer(3000, TimeUnit.MILLISECONDS)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<Long>() {
@Override
public void accept(Long aLong) throws Exception {
LogUtils.e("当前线程:"+Thread.currentThread().getName()+",结束:"+aLong);
}
});
延时3秒后打印结果,.observeOn(AndroidSchedulers.mainThread()) 指定观察者在主线程
2.interval:创建一个可周期性发送事件的被观察者,即每隔一段时间做某事
// 第一个参数间隔多长时间,第二个参数时间单位毫秒
Observable.interval(1000,TimeUnit.MILLISECONDS)
.subscribe(new Consumer<Long>() {
@Override
public void accept(Long aLong) throws Exception {
LogUtils.e("当前线程:"+Thread.currentThread().getName()+",倒计时:"+aLong);
}
});
每隔1秒发送一个事件,这里没有指定观察者所在线程,可以看到是在Rxjava下的一个工作线程
LogUtils.e("开始");
Observable.interval(5000,2000,TimeUnit.MILLISECONDS).subscribe(new Consumer<Long>() {
@Override
public void accept(Long aLong) throws Exception {
LogUtils.e("当前线程:"+Thread.currentThread().getName()+",倒计时:"+aLong);
}
});
interval的第一个参数是指延时多长时间才发送事件,可以看出这里延迟了5s,观察者才接收第一个事件
3.map:属于变换操作符,它的作用将被观察者Observable发送的数据应用一个函数进行变换操作,然后将变换后的数据发送给观察者
take:属于过滤操作符,规定发送给观察者的总的事件数
上面interval的应用只能做计时操作,要做倒计时的话,这里就需要map进行数据的转换,然后再发送给观察者
//map操作符属于变换操作符,它的作用将被观察者Observable发送的数据应用一个函数进行变换操作,然后将变换后的数据发送给观察者Observer。
//take 规定发给观察者的次数
long totalTime = 10;
LogUtils.e("开始");
Observable.interval(2000,1000,TimeUnit.MILLISECONDS)
.take(10)//限制发送次数
.map(new Function<Long, Long>() {
@Override
public Long apply(Long aLong) throws Exception {
return totalTime - aLong;//将接受的1,2,3... 转换为 3,2,1..类似的数据
}
}).subscribe(new Consumer<Long>() {
@Override
public void accept(Long aLong) throws Exception {
LogUtils.e("当前线程:"+Thread.currentThread().getName()+",倒计时:"+aLong);
}
});
一个10s的倒计时操作就完成了,map的使用可以举一反三,比如服务器返回的json数据,我们可以转换为对应的对象;
总结:简单的体验了Rxjava的几个操作符,可以看到对数据,事件的操作像流水线一样,即使是线程的切换也变得很轻松,后续继续加油