溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

基于RxJava框架實(shí)現(xiàn)獲取驗(yàn)證碼的輔助類

發(fā)布時(shí)間:2020-08-21 11:48:18 來源:腳本之家 閱讀:178 作者:AndroidApeMan 欄目:移動(dòng)開發(fā)

本文實(shí)例為大家分享了RxJava實(shí)現(xiàn)獲取驗(yàn)證碼輔助類的具體代碼,供大家參考,具體內(nèi)容如下

應(yīng)用場景:

一般的項(xiàng)目中都有獲取驗(yàn)證碼這個(gè)功能,并且可能不止一個(gè)地方用到。其邏輯時(shí)通的:
…實(shí)時(shí)監(jiān)控輸入框中手機(jī)號(hào)或者郵箱的合法性
…合法時(shí)可點(diǎn)擊獲取驗(yàn)證碼按鈕
…點(diǎn)擊按鈕時(shí)調(diào)用接口去請(qǐng)求驗(yàn)證碼,同時(shí)按鈕變?yōu)椴豢牲c(diǎn)擊,顯示倒計(jì)時(shí)
…請(qǐng)求成功時(shí)執(zhí)行正常邏輯,請(qǐng)求失敗后倒計(jì)時(shí)取消,按鈕狀態(tài)恢復(fù)

設(shè)計(jì)思路

…整個(gè)功能涉及的對(duì)象:一個(gè)EditText用于輸入賬號(hào)信息,一個(gè)獲取驗(yàn)證碼的Button,一個(gè)Rxjava的管理器用于管理Rx事件的生命周期(不同的管理方案可自行配對(duì))
…初始化監(jiān)控EditText輸入,初始化防抖按鈕點(diǎn)擊事件
…處理事件中的邏輯
…開發(fā)兩個(gè)抽象方法,獲取驗(yàn)證碼的方法和驗(yàn)證規(guī)則方法

代碼

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: 處理驗(yàn)證碼的工具
 * @date 17/3/22
 */
public abstract class CheckCodeUtil {
  private RxManager mRxManager;
  private Button btnGetCheckCode;
  private EditText edtAccount;
  //驗(yàn)證碼獲取中,按鈕始終是倒計(jì)時(shí)狀態(tài),不受輸入框事件的影響
  protected boolean countDowning = false;
  //用于取消倒計(jì)時(shí)

  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);
    //賬號(hào)輸入不合理不能點(diǎn)擊獲取驗(yàn)證碼
    mRxManager.add(observableAccount
        .subscribeOn(AndroidSchedulers.mainThread())
        .subscribe(new Action1<CharSequence>() {
          @Override
          public void call(CharSequence charSequence) {
            if(!countDowning){//這樣能減少重復(fù)執(zhí)行
              if (etCheck(charSequence.toString())) {
                RxView.enabled(btnGetCheckCode).call(true);
              } else {
                RxView.enabled(btnGetCheckCode).call(false);
              }
            }
          }
        }));
    //點(diǎn)擊獲取驗(yàn)證碼
    mRxManager.add(
        RxView.clicks(btnGetCheckCode)
            .throttleFirst(Constant.CLICK_THROTTLE, TimeUnit.SECONDS)
            .subscribe(new Action1<Void>() {
              @Override
              public void call(Void aVoid) {
                getCheckCode();
              }
            })
    );
  }
  /**
   * 獲取驗(yàn)證碼
   */
  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();
            //按鈕變?yōu)椴豢牲c(diǎn)擊
            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);
  }

  /**
   * 獲取驗(yàn)證碼
   */
  public abstract void getCodeNumber();

  /**
   * 驗(yàn)證規(guī)則
   * @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;
      }
    }
  }
}

使用實(shí)例

@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("獲取驗(yàn)證碼失敗:" + message);
  checkCodeUtil.getCodeError();
}


特點(diǎn)

…減少代碼冗余
…方便需求維護(hù)

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持億速云。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI