前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于RxJava框架实现获取验证码的辅助类

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

作者头像
砸漏
发布2020-11-05 11:02:23
5520
发布2020-11-05 11:02:23
举报
文章被收录于专栏:恩蓝脚本

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

应用场景:

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

设计思路

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

代码

代码语言:javascript
复制
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;
}
}
}
}

使用实例

代码语言:javascript
复制
@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();
}

特点

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

以上就是本文的全部内容,希望对大家的学习有所帮助。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-09-11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
验证码
腾讯云新一代行为验证码(Captcha),基于十道安全栅栏, 为网页、App、小程序开发者打造立体、全面的人机验证。最大程度保护注册登录、活动秒杀、点赞发帖、数据保护等各大场景下业务安全的同时,提供更精细化的用户体验。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档