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