激情久久久_欧美视频区_成人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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 毛片在线免费 | 狠狠色成色综合网 | 久久91久久久久麻豆精品 | 国产精品久久久久久久久久三级 | 亚洲成人精品久久久 | 免费观看一区二区三区 | 国产在线欧美 | 91短视频在线视频 | 亚洲成人中文字幕在线 | 亚洲va国产va| 成人片免费看 | 久久久在线免费观看 | 中文字幕精品在线播放 | 18一20岁一级毛片 | 涩涩伊人| 久草成人在线 | 成人做爰高潮片免费视频美国 | 欧美精品一区二区视频 | 久久一区二区三区av | 国产亚洲精品久久久久5区 日韩一级片一区二区三区 国产精品久久久久av | 国产大片在线观看 | 久在线观看福利视频69 | 91福利在线观看 | 国产大片免费看 | 欧美顶级毛片在线播放小说 | 成人性生活视频在线观看 | 欧美区在线 | 免费看毛片的网站 | 日韩不卡一区二区 | 日韩一级免费毛片 | 国产在线1区 | 欧美伦交 | 意大利av在线 | 国产91精品欧美 | 黄色特级大片 | 亚洲最新黄色网址 | 国产精品久久av | 97超级碰碰人国产在线观看 | 精品一区二区久久久久久按摩 | 免费一级a毛片在线播放视 日日草夜夜操 | 999精品国产|