首页 > 系统 > Android > 正文

基于RxJava框架实现获取验证码的辅助类

2019-10-21 21:49:11
字体:
来源:转载
供稿:网友

本文实例为大家分享了RxJava实现获取验证码辅助类的具体代码,供大家参考,具体内容如下

应用场景: 

一般的项目中都有获取验证码这个功能,并且可能不止一个地方用到。其逻辑时通的: 
…实时监控输入框中手机号或者邮箱的合法性 
…合法时可点击获取验证码按钮 
…点击按钮时调用接口去请求验证码,同时按钮变为不可点击,显示倒计时 
…请求成功时执行正常逻辑,请求失败后倒计时取消,按钮状态恢复 

设计思路 

…整个功能涉及的对象:一个EditText用于输入账号信息,一个获取验证码的Button,一个Rxjava的管理器用于管理Rx事件的生命周期(不同的管理方案可自行配对) 
…初始化监控EditText输入,初始化防抖按钮点击事件 
…处理事件中的逻辑 
…开发两个抽象方法,获取验证码的方法和验证规则方法 

代码

package txcap.com.bigtime.utils;import android.widget.Button;import android.widget.EditText;import com.jakewharton.rxbinding.view.RxView;import com.jakewharton.rxbinding.widget.RxTextView;import java.util.concurrent.TimeUnit;import rx.Observable;import rx.Subscriber;import rx.Subscription;import rx.android.schedulers.AndroidSchedulers;import rx.functions.Action0;import rx.functions.Action1;import txcap.com.bigtime.Constant;import txcap.com.bigtime.R;import txcap.com.library.core.app.BaseApplication;import txcap.com.library.core.rx.RxManager;import txcap.com.library.utils.file.ResUtil;/** * @author gaojigong * @version V1.0 * @Description: 处理验证码的工具 * @date 17/3/22 */public abstract class CheckCodeUtil {  private RxManager mRxManager;  private Button btnGetCheckCode;  private EditText edtAccount;  //验证码获取中,按钮始终是倒计时状态,不受输入框事件的影响  protected boolean countDowning = false;  //用于取消倒计时  private Subscription intervalSub;  public CheckCodeUtil(RxManager mRxManager, Button btnGetCheckCode, EditText edtAccount) {    this.mRxManager = mRxManager;    this.btnGetCheckCode = btnGetCheckCode;    this.edtAccount = edtAccount;    init();  }  private void init() {    RxView.enabled(btnGetCheckCode).call(false);    Observable<CharSequence> observableAccount = RxTextView.textChanges(edtAccount);    //账号输入不合理不能点击获取验证码    mRxManager.add(observableAccount        .subscribeOn(AndroidSchedulers.mainThread())        .subscribe(new Action1<CharSequence>() {          @Override          public void call(CharSequence charSequence) {            if(!countDowning){//这样能减少重复执行              if (etCheck(charSequence.toString())) {                RxView.enabled(btnGetCheckCode).call(true);              } else {                RxView.enabled(btnGetCheckCode).call(false);              }            }          }        }));    //点击获取验证码    mRxManager.add(        RxView.clicks(btnGetCheckCode)            .throttleFirst(Constant.CLICK_THROTTLE, TimeUnit.SECONDS)            .subscribe(new Action1<Void>() {              @Override              public void call(Void aVoid) {                getCheckCode();              }            })    );  }  /**   * 获取验证码   */  private void getCheckCode() {    intervalSub = Observable.interval(0,1,TimeUnit.SECONDS, AndroidSchedulers.mainThread())        .take(Constant.CHECK_CODE_SECOND)        .doOnSubscribe(new Action0() {          @Override          public void call() {            getCodeNumber();            //按钮变为不可点击            RxView.enabled(btnGetCheckCode).call(false);            countDowning = true;          }        })        .subscribe(new Subscriber<Long>() {          @Override          public void onCompleted() {            countDowning = false;            RxTextView.text(btnGetCheckCode).call(ResUtil.getResString(BaseApplication.getAppContext(),R.string.get_check_code));            if(etCheck(edtAccount.getText().toString())){              RxView.enabled(btnGetCheckCode).call(true);            }          }          @Override          public void onError(Throwable e) {            countDowning = false;            RxTextView.text(btnGetCheckCode).call(ResUtil.getResString(BaseApplication.getAppContext(),R.string.get_check_code));            if(etCheck(edtAccount.getText().toString())){              RxView.enabled(btnGetCheckCode).call(true);            }          }          @Override          public void onNext(Long aLong) {            RxTextView.text(btnGetCheckCode).call((Constant.CHECK_CODE_SECOND - aLong)+"s");          }        });    mRxManager.add(intervalSub);  }  /**   * 获取验证码   */  public abstract void getCodeNumber();  /**   * 验证规则   * @param str   * @return   */  public abstract boolean etCheck(String str);  public void getCodeError(){    if(null != intervalSub){      if(!intervalSub.isUnsubscribed()){        intervalSub.unsubscribe();        RxTextView.text(btnGetCheckCode).call(ResUtil.getResString(BaseApplication.getAppContext(),R.string.get_check_code));        RxView.enabled(btnGetCheckCode).call(true);        countDowning = false;      }    }  }}

使用实例

@BindView(R.id.edt_account)EditText edtAccount;@BindView(R.id.btn_get_check_code)Button btnGetCheckCode;private CheckCodeUtil checkCodeUtil;checkCodeUtil = new CheckCodeUtil(mRxManager,btnGetCheckCode,edtAccount) {  @Override  public void getCodeNumber() {    mPresenter.getCode(edtAccount.getText().toString());  }  @Override  public boolean etCheck(String str) {    return StrCheckUtil.checkedAccount(str);  }};@Overridepublic void getCodeFailed(String message) {  showToastLong("获取验证码失败:" + message);  checkCodeUtil.getCodeError();}

特点 

…减少代码冗余 
…方便需求维护

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持VEVB武林网。


注:相关教程知识阅读请移步到Android开发频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表