RxJava - interval操作符实现“验证码倒计时”效果

  • Observable.interval(0, 1, TimeUnit.SECONDS)
    参数一:什么时候开始发送
    参数二:隔多长时间发一次
    参数三:计时的单位,是秒还是毫秒

  • .take(count)
    发送验证码,到60肯定会停下来,总不能一直发射数据吧。take就是发射数据后控制什么时候停下来

  • .map
    耳熟能详,就是用来把发射出去的值转换一下,转成你想要的。比如不用map,发射出的数据就是1,2,3,4,5, 使用了map,我在最终接收数据前,把发射的数据转换一下,就变成了 5,4,3,2,1

  • .doOnSubscribe
    在 subscribe() 调用后而且在事件发送前执行;默认情况下, doOnSubscribe() 执行在 subscribe() 发生的线程

 /**
     * 发送验证码倒计时
     *
     * @param view
     */
    public void sendVerfi(final View view) {
        final int count = 5;

        Observable.interval(0, 1, TimeUnit.SECONDS)
                .take(count)
                .map(new Function() {
                    @Override
                    public Long apply(Long aLong) throws Exception {
                        return count - aLong;
                    }
                })
                .observeOn(AndroidSchedulers.mainThread())
                .doOnSubscribe(new Consumer() {
                    @Override
                    public void accept(Disposable disposable) throws Exception {
                        view.setEnabled(false);
                    }
                })
                .subscribe(new Observer() {
                    @Override
                    public void onSubscribe(Disposable d) {

                    }

                    @Override
                    public void onNext(Long aLong) {
                        ((Button) view).setText(aLong + "");
                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onComplete() {
                        view.setEnabled(true);
                    }
                });
    }

你可能感兴趣的:(RxJava - interval操作符实现“验证码倒计时”效果)