基于RxJava框架实现获取验证码的辅助类
本文实例为大家分享了RxJava实现获取验证码辅助类的具体代码,供大家参考,具体内容如下
应用场景:
一般的项目中都有获取验证码这个功能,并且可能不止一个地方用到。其逻辑时通的:
…实时监控输入框中手机号或者邮箱的合法性
…合法时可点击获取验证码按钮
…点击按钮时调用接口去请求验证码,同时按钮变为不可点击,显示倒计时
…请求成功时执行正常逻辑,请求失败后倒计时取消,按钮状态恢复
设计思路
…整个功能涉及的对象:一个EditText用于输入账号信息,一个获取验证码的Button,一个Rxjava的管理器用于管理Rx事件的生命周期(不同的管理方案可自行配对)
…初始化监控EditText输入,初始化防抖按钮点击事件
…处理事件中的逻辑
…开发两个抽象方法,获取验证码的方法和验证规则方法
代码
packagetxcap.com.bigtime.utils;
importandroid.widget.Button;
importandroid.widget.EditText;
importcom.jakewharton.rxbinding.view.RxView;
importcom.jakewharton.rxbinding.widget.RxTextView;
importjava.util.concurrent.TimeUnit;
importrx.Observable;
importrx.Subscriber;
importrx.Subscription;
importrx.android.schedulers.AndroidSchedulers;
importrx.functions.Action0;
importrx.functions.Action1;
importtxcap.com.bigtime.Constant;
importtxcap.com.bigtime.R;
importtxcap.com.library.core.app.BaseApplication;
importtxcap.com.library.core.rx.RxManager;
importtxcap.com.library.utils.file.ResUtil;
/**
*@authorgaojigong
*@versionV1.0
*@Description:处理验证码的工具
*@date17/3/22
*/
publicabstractclassCheckCodeUtil{
privateRxManagermRxManager;
privateButtonbtnGetCheckCode;
privateEditTextedtAccount;
//验证码获取中,按钮始终是倒计时状态,不受输入框事件的影响
protectedbooleancountDowning=false;
//用于取消倒计时
privateSubscriptionintervalSub;
publicCheckCodeUtil(RxManagermRxManager,ButtonbtnGetCheckCode,EditTextedtAccount){
this.mRxManager=mRxManager;
this.btnGetCheckCode=btnGetCheckCode;
this.edtAccount=edtAccount;
init();
}
privatevoidinit(){
RxView.enabled(btnGetCheckCode).call(false);
ObservableobservableAccount=RxTextView.textChanges(edtAccount);
//账号输入不合理不能点击获取验证码
mRxManager.add(observableAccount
.subscribeOn(AndroidSchedulers.mainThread())
.subscribe(newAction1(){
@Override
publicvoidcall(CharSequencecharSequence){
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(newAction1(){
@Override
publicvoidcall(VoidaVoid){
getCheckCode();
}
})
);
}
/**
*获取验证码
*/
privatevoidgetCheckCode(){
intervalSub=Observable.interval(0,1,TimeUnit.SECONDS,AndroidSchedulers.mainThread())
.take(Constant.CHECK_CODE_SECOND)
.doOnSubscribe(newAction0(){
@Override
publicvoidcall(){
getCodeNumber();
//按钮变为不可点击
RxView.enabled(btnGetCheckCode).call(false);
countDowning=true;
}
})
.subscribe(newSubscriber(){
@Override
publicvoidonCompleted(){
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
publicvoidonError(Throwablee){
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
publicvoidonNext(LongaLong){
RxTextView.text(btnGetCheckCode).call((Constant.CHECK_CODE_SECOND-aLong)+"s");
}
});
mRxManager.add(intervalSub);
}
/**
*获取验证码
*/
publicabstractvoidgetCodeNumber();
/**
*验证规则
*@paramstr
*@return
*/
publicabstractbooleanetCheck(Stringstr);
publicvoidgetCodeError(){
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)
EditTextedtAccount;
@BindView(R.id.btn_get_check_code)
ButtonbtnGetCheckCode;
privateCheckCodeUtilcheckCodeUtil;
checkCodeUtil=newCheckCodeUtil(mRxManager,btnGetCheckCode,edtAccount){
@Override
publicvoidgetCodeNumber(){
mPresenter.getCode(edtAccount.getText().toString());
}
@Override
publicbooleanetCheck(Stringstr){
returnStrCheckUtil.checkedAccount(str);
}
};
@Override
publicvoidgetCodeFailed(Stringmessage){
showToastLong("获取验证码失败:"+message);
checkCodeUtil.getCodeError();
}
特点
…减少代码冗余
…方便需求维护
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。