Android开发丶使用RxJava来完成倒计时功能

RxJava是在2016年左右火起来的,现已成为各大项目平台必用的框架,通常与MVP模式、Retrofit网络框架组合起来,为开发者提供更为强大,稳定的开发基础框架,还记得熟悉mvc开发的我第一次见到该框架时,初识繁琐,后知其妙,接下来简单做下有关倒计时功能的整理,一般在注册模块中,给新手机号发送验证码会用得到,本文仅提供倒计时的方法,相关请求验证码下发接口的功能需要大家自己去请求集成。

效果图:

手机不方便截动图,所以在后台日志打印出来,大家使用过程中,把打印出来的值setText到发送按钮上即可。

实现方法:

1.首先添加RxJava和RxAndroid依赖

2.在Activity给发送按钮设置点击事件

private Disposable disposable;
btn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        disposable= Flowable
                .intervalRange(1, 20, 0, 1, TimeUnit.SECONDS)//从1输出到20,延时0s,间隔1s
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .doOnNext(new Consumer<Long>() {
                    @Override
                    public void accept(Long aLong) throws Exception {
                        Log.d("fantasychongstatus", String.valueOf(20- aLong));
                        btn.setText((20- aLong)+ "秒后重发");
                        btn.setClickable(false);
                    }
                })
                .doOnComplete(new Action() {
                    @Override
                    public void run() throws Exception {
                        Log.d("fantasychongstatus", "计时完成");
                        btn.setText("获取验证码");
                        btn.setClickable(true);
                    }
                })
                .subscribe();
    }
});

值得一提的是,在输出数值的过程中,我们要把发送按钮设为不可点击,否则再次点击会再次输出,造成多重输出的现象。

等输出完成后,再重新设置可点击即可。

.doOnNext(new Consumer<Long>() {
    @Override
    public void accept(Long aLong) throws Exception {
        Log.d("fantasychongstatus", String.valueOf(20- aLong));
        btn.setText((20- aLong)+ "秒后重发");
        btn.setClickable(false);
    }
})
.doOnComplete(new Action() {
    @Override
    public void run() throws Exception {
        Log.d("fantasychongstatus", "计时完成");
        btn.setText("获取验证码");
        btn.setClickable(true);
    }
})

3.最后在onDestroy中dispose

@Override
protected void onDestroy() {
    super.onDestroy();
    if (disposable!= null){
        disposable.dispose();
    }
}

至此全部完成,demo附上!

源码下载

猜你喜欢

转载自blog.csdn.net/u014078990/article/details/82457380