一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Android - 基于RxJava框架實現獲取驗證碼的輔助類

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

2022-03-07 14:44AndroidApeMan Android

這篇文章主要為大家詳細介紹了基于RxJava框架實現獲取驗證碼的輔助類,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了RxJava實現獲取驗證碼輔助類的具體代碼,供大家參考,具體內容如下

應用場景:

一般的項目中都有獲取驗證碼這個功能,并且可能不止一個地方用到。其邏輯時通的:
…實時監控輸入框中手機號或者郵箱的合法性
…合法時可點擊獲取驗證碼按鈕
…點擊按鈕時調用接口去請求驗證碼,同時按鈕變為不可點擊,顯示倒計時
…請求成功時執行正常邏輯,請求失敗后倒計時取消,按鈕狀態恢復

設計思路

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

代碼

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
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;
      }
    }
  }
}

使用實例

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@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();
}

特點

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:https://blog.csdn.net/jigongdajiang/article/details/65442569

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 床戏小说 | 亚洲国产综合久久久无码色伦 | 日韩免费在线视频观看 | 好吊色视频988gao在线观看 | 成人观看免费大片在线观看 | 女人张开腿 让男人桶个爽 免费观看 | 成人日b视频 | 精品在线免费观看视频 | 91久久精品国产亚洲 | 久久成人a毛片免费观看网站 | bb18lv黑料正能量 | 97影院网| 日本美女xx | 亚洲精品乱码久久久久久蜜桃 | 男人躁女人过程 | 日韩高清在线高清免费 | 国产区久久 | 国产成人h综合亚洲欧美在线 | 国产欧美曰韩一区二区三区 | 欧美精品久久久久久久免费观看 | 欧美日韩亚洲国内综合网香蕉 | 日韩欧美精品 | 日韩国产成人精品视频人 | 91av俱乐部 | 久久成人亚洲 | 视频一区国产精戏刘婷 | 青草青草视频2免费观看 | 国产在线视频在线观看 | 午夜影院免费看 | 国产亚洲一级精品久久 | 厨房里摸着乳丰满在线观看 | 日本在线观看www | 边摸边吃奶玩乳尖视频 | 97色吧| 免费观看国产大片资源视频 | 国语精彩对白2021 | 男人天堂bt| 国产一区二区三区四 | 免费高清www动漫视频播放器 | 国产成人综合亚洲一区 | 国产精品视频在线观看 |