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

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

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 青青青久热国产精品视频 | 亚洲精品午夜久久aaa级久久久 | 干妞网免费视频 | 欧美色图日韩 | 4399h漫画| 奇米影视在线观看 | 亚洲国产精品福利片在线观看 | 亚洲第一色网 | a级影视| 五月天淫 | 青草视频在线观看免费视频 | 亚洲国产精品日本无码网站 | 男人天堂999 | 国产普通话对白露脸流出 | 纲手被强喷水羞羞漫画 | 精品亚洲视频在线观看 | 黑人chinese女人 | 国产一卡二卡四卡免费 | 精品国产一级毛片大全 | sese在线观看 | 精品久久洲久久久久护士免费 | 香蕉成人999视频 | 日本成人黄色片 | 我的妹妹最近有点怪在线观看 | 国产情侣自拍网 | 精品国产一区二区在线观看 | 亚洲国产成人久久综合区 | 亚洲精品国产精麻豆久久99 | 插入粉嫩 | 国产精品成人免费观看 | sp啪啪调教打屁股网站 | 亚洲高清中文字幕精品不卡 | 日韩毛片免费 | 免费观看伦理片 | 久久婷婷丁香五月色综合啪免费 | 色猪视频| ck7788免费视频 | 高肉h护士办公室play | 亚洲另类激情 | 欧美精品国产一区二区 | 无遮挡h肉动漫在线观看电车 |