【Rxjava学习】timer、interval、take、map实现计时器

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的几个操作符,可以看到对数据,事件的操作像流水线一样,即使是线程的切换也变得很轻松,后续继续加油

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值