国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

基于RxJava框架實現獲取驗證碼的輔助類

2019-10-21 21:49:11
字體:
來源:轉載
供稿:網友

本文實例為大家分享了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;/** * @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;      }    }  }}

使用實例

@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);  }};@Overridepublic void getCodeFailed(String message) {  showToastLong("獲取驗證碼失敗:" + message);  checkCodeUtil.getCodeError();}

特點 

…減少代碼冗余 
…方便需求維護

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 色达县| 娱乐| 郴州市| 友谊县| 常州市| 荣昌县| 康平县| 田东县| 汉中市| 辽中县| 清水河县| 金堂县| 卢龙县| 朝阳区| 鹤壁市| 孝昌县| 白山市| 镇原县| 浦城县| 高邑县| 海原县| 巴彦县| 汾西县| 抚远县| 封开县| 肇州县| 通化市| 丹东市| 弋阳县| 酒泉市| 云龙县| 托里县| 安新县| 井研县| 珲春市| 仪征市| 二手房| 炎陵县| 炎陵县| 巢湖市| 昌乐县|