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附上!