基于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

本文链接:https://my.lmcjl.com/post/9856.html

展开阅读全文

4 评论

留下您的评论.