栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 移动开发 > Android

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

Android 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

本文实例为大家分享了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;


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

  
  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();
}


特点

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

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/155964.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号