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<Long, Long>() {
                    @Override
                    public Long apply(Long aLong) throws Exception {
                        return count - aLong;
                    }
                })
                .observeOn(AndroidSchedulers.mainThread())
                .doOnSubscribe(new Consumer<Disposable>() {
                    @Override
                    public void accept(Disposable disposable) throws Exception {
                        view.setEnabled(false);
                    }
                })
                .subscribe(new Observer<Long>() {
                    @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);
                    }
                });
    }
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容