基于RxJava框架實(shí)現(xiàn)獲取驗(yàn)證碼的輔助類
本文實(shí)例為大家分享了RxJava實(shí)現(xiàn)獲取驗(yàn)證碼輔助類的具體代碼,供大家參考,具體內(nèi)容如下
應(yīng)用場景:
一般的項(xiàng)目中都有獲取驗(yàn)證碼這個(gè)功能,并且可能不止一個(gè)地方用到。其邏輯時(shí)通的:
…實(shí)時(shí)監(jiān)控輸入框中手機(jī)號(hào)或者郵箱的合法性
…合法時(shí)可點(diǎn)擊獲取驗(yàn)證碼按鈕
…點(diǎn)擊按鈕時(shí)調(diào)用接口去請(qǐng)求驗(yàn)證碼,同時(shí)按鈕變?yōu)椴豢牲c(diǎn)擊,顯示倒計(jì)時(shí)
…請(qǐng)求成功時(shí)執(zhí)行正常邏輯,請(qǐng)求失敗后倒計(jì)時(shí)取消,按鈕狀態(tài)恢復(fù)
設(shè)計(jì)思路
…整個(gè)功能涉及的對(duì)象:一個(gè)EditText用于輸入賬號(hào)信息,一個(gè)獲取驗(yàn)證碼的Button,一個(gè)Rxjava的管理器用于管理Rx事件的生命周期(不同的管理方案可自行配對(duì))
…初始化監(jiān)控EditText輸入,初始化防抖按鈕點(diǎn)擊事件
…處理事件中的邏輯
…開發(fā)兩個(gè)抽象方法,獲取驗(yàn)證碼的方法和驗(yàn)證規(guī)則方法
代碼
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: 處理驗(yàn)證碼的工具
* @date 17/3/22
*/
public abstract class CheckCodeUtil {
private RxManager mRxManager;
private Button btnGetCheckCode;
private EditText edtAccount;
//驗(yàn)證碼獲取中,按鈕始終是倒計(jì)時(shí)狀態(tài),不受輸入框事件的影響
protected boolean countDowning = false;
//用于取消倒計(jì)時(shí)
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);
//賬號(hào)輸入不合理不能點(diǎn)擊獲取驗(yàn)證碼
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);
}
}
}
}));
//點(diǎn)擊獲取驗(yàn)證碼
mRxManager.add(
RxView.clicks(btnGetCheckCode)
.throttleFirst(Constant.CLICK_THROTTLE, TimeUnit.SECONDS)
.subscribe(new Action1<Void>() {
@Override
public void call(Void aVoid) {
getCheckCode();
}
})
);
}
/**
* 獲取驗(yàn)證碼
*/
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(diǎn)擊
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);
}
/**
* 獲取驗(yàn)證碼
*/
public abstract void getCodeNumber();
/**
* 驗(yàn)證規(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;
}
}
}
}
使用實(shí)例
@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("獲取驗(yàn)證碼失敗:" + message);
checkCodeUtil.getCodeError();
}
特點(diǎn)
…減少代碼冗余
…方便需求維護(hù)
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Flutter交互并使用小工具管理其狀態(tài)widget的state詳解
這篇文章主要為大家介紹了Flutter交互并使用小工具管理其狀態(tài)widget的state詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12
Android recyclerview實(shí)現(xiàn)縱向虛線時(shí)間軸的示例代碼
本文主要介紹了Android recyclerview實(shí)現(xiàn)縱向虛線時(shí)間軸的示例代碼,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07
android-wheel控件實(shí)現(xiàn)三級(jí)聯(lián)動(dòng)效果
這篇文章主要為大家詳細(xì)介紹了android-wheel控件實(shí)現(xiàn)三級(jí)聯(lián)動(dòng)效果的代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10
Android實(shí)現(xiàn)選擇相冊(cè)圖片并顯示功能
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)選擇相冊(cè)圖片并顯示功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-04-04
Android ExpandableListView單選以及多選實(shí)現(xiàn)代碼
這篇文章主要為大家詳細(xì)介紹了Android ExpandableListView單選以及多選的實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06
Android編程之ListView和EditText發(fā)布帖子隱藏軟鍵盤功能詳解
這篇文章主要介紹了Android編程之ListView和EditText發(fā)布帖子隱藏軟鍵盤功能,結(jié)合實(shí)例形式分析了Android控件調(diào)用、隱藏軟鍵盤的原理與具體實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-08-08
在Android Studio中Parcelable插件的簡單使用教程
下面小編就為大家分享一篇在Android Studio中Parcelable插件的簡單使用教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2017-11-11
Flutter實(shí)現(xiàn)漸變弧形進(jìn)度條的示例詳解
在Flutter開發(fā)中,構(gòu)建一個(gè)具有視覺吸引力的、反映進(jìn)度的圓形弧形進(jìn)度條是一個(gè)常見需求,本文將詳細(xì)介紹如何使用Flutter和Dart語言實(shí)現(xiàn)這一功能,需要的可以參考下2023-12-12
Android自定義可拖拽的懸浮按鈕DragFloatingActionButton
這篇文章主要介紹了Android自定義可拖拽的懸浮按鈕DragFloatingActionButton,需要的朋友可以參考下2017-06-06

