激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

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

服務(wù)器之家 - 編程語言 - Android - 基于RxJava框架實現(xiàn)獲取驗證碼的輔助類

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

2022-03-07 14:44AndroidApeMan Android

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

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

應(yīng)用場景:

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

設(shè)計思路

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

代碼

?
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;
  //驗證碼獲取中,按鈕始終是倒計時狀態(tài),不受輸入框事件的影響
  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){//這樣能減少重復(fù)執(zhí)行
              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();
            //按鈕變?yōu)椴豢牲c擊
            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();
 
  /**
   * 驗證規(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;
      }
    }
  }
}

使用實例

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

特點

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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲网站免费观看 | 免费一级片观看 | 特色一级黄色片 | 久久久大片 | 嫩呦国产一区二区三区av | 91久久极品少妇韩国 | 国产精品午夜小视频观看 | 国产精品一区二区三区在线 | 国产精品视频专区 | 四虎影院成人 | 国产精品视频六区 | 欧美一级做一a做片性视频 日韩黄色片免费看 | 亚洲男人一区 | 一级成人免费 | 久久久精品视频免费看 | 欧美日韩亚洲精品一区二区三区 | 国产精品一区免费在线观看 | 爱操影视 | 美女网站黄在线观看 | 黄色免费不卡视频 | 久久精品视频免费观看 | free japan xxxxhdsex69 | 91久久国产露脸精品免费 | 在线播放亚洲视频 | 澳门一级淫片免费视频 | 久久免费视频一区 | 国产精品久久久久久久久久久久久久久 | 亚洲精品v天堂中文字幕 | 老子午夜影院 | 欧美精品v国产精品v日韩精品 | 一级片观看| 亚洲一区成人在线 | 欧美a v在线 | 毛片免费视频播放 | 成人在线视频在线观看 | 免费在线观看中文字幕 | 欧美一区二区三区不卡免费观看 | 久久露脸国语精品国产91 | 国产精品久久77777 | 久久精品视频7 | 97中文字幕在线观看 |