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

网友投稿 289 2023-01-27


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

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

应用场景:

一般的项目中都有获取验证码这个功能,并且可能不止一个地方用到。其逻辑时通的:

…实时监控输入框中手机号或者邮箱的合法性

…合法时可点击获取验证码按钮

…点击按钮时调用接口去请求验证码,同时按钮变为不可点击,显示倒计时

…请求成功时执行正常逻辑,请求失败后倒计时取消,按钮状态恢复

设计思路

…整个功能涉及的对象:一个EditText用于输入账号信息,一个获取验证码的Button,一个Rxjava的管理器用于管理Rx事件的生命周期(不同的管理方案可自行配对)

…初始化监控EditText输入,初始化防抖按钮点击事件

…处理事件中的逻辑

…开发两个抽象方法,获取验证码的方法和验证规则方法

代码

package txcap.com.bigtimegQdPruoRG.utils;

import android.widget.Button;

import andrgQdPruoRGoid.widget.EditText;

import com.jakgQdPruoRGewharton.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 observableAccount = RxTextView.textChanges(edtAccount);

//账号输入不合理不能点击获取验证码

mRxManager.add(observableAccount

.subscribeOn(AndroidSchedulers.mainThread())

.subscribe(new Action1() {

@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() {

@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() {

@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);

}

};

@Override

public void getCodeFailed(String message) {

showToastLong("获取验证码失败:" + message);

checkCodeUtil.getCodeError();

}

特点

…减少代码冗余

…方便需求维护


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:包含共享文件系统怎么使用的词条
下一篇:接口自动化测试有哪些应用(什么是接口自动化测试)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~