本文實例為大家分享了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