需求:
登陸或者注冊時(shí)點(diǎn)擊獲取驗(yàn)證碼按鈕舵抹,進(jìn)行60s倒計(jì)時(shí),倒計(jì)時(shí)過程中不允許點(diǎn)擊按鈕扇救。倒計(jì)時(shí)秒數(shù)需要實(shí)時(shí)顯示
效果圖:
驗(yàn)證碼1.png
驗(yàn)證碼2.png
圖1是未獲取之前迅腔,圖2是點(diǎn)擊之后
思路:
倒計(jì)時(shí)一般有幾種解決方案陶缺,常用用Timer饱岸,Handler,RxJava汤锨。
不過經(jīng)過測試Timer和Handler時(shí)間都有誤差百框,不準(zhǔn)。項(xiàng)目建議采用RxJava
關(guān)鍵代碼:
在項(xiàng)目的build.gradle中添加RxJava2依賴
implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
implementation 'io.reactivex.rxjava2:rxjava:2.0.7'
注:如果項(xiàng)目已經(jīng)有RxJava2就不用重復(fù)添加了
TimeUtils
public static Disposable dealCountDownS(long second, Consumer<Long> nextObserver, Consumer<Throwable> errorObserver, Action completeObserver ) {
return Observable
.interval(1, TimeUnit.SECONDS, AndroidSchedulers.mainThread())
.take(second)
.subscribe(nextObserver,errorObserver,completeObserver);
}
開始使用:
public class RegOneNewActivity extends BaseActivity<RegOneIView, RegOnePresenter> implements RegOneIView {
@BindView(R.id.tv_get_code)
TextView tvGetCode;
//是否開啟倒計(jì)時(shí)
private boolean isStartCountDown;
private Disposable subscription;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initHeadView(R.layout.activity_regist_one_new, false);
showRealView();
}
@Override
protected void initPrClick() {
super.initPrClick();
//獲取驗(yàn)證碼
ViewShow.prClick(tvGetCode, new Action1() {
@Override
public void call(Object o) {
if (!isStartCountDown) {
onGetRegCode()
}
}
});
}
public void onGetRegCode() {
//獲取驗(yàn)證碼成功,進(jìn)行倒計(jì)時(shí)
isStartCountDown = true;
//Constant.CODE_COUNTDOWN_TIME :60
tvGetCode.setText(Constant.CODE_COUNTDOWN_TIME + "s");
subscription = TimeUtils.dealCountDownS(Constant.CODE_COUNTDOWN_TIME, new Consumer<Long>() {
@Override
public void accept(Long aLong) throws Exception {
//每隔一秒
if (null != tvGetCode) {
tvGetCode.setText((TextUtils.concat(String.valueOf(Math.abs(aLong - Constant.CODE_COUNTDOWN_TIME)), "s")).toString());
}
}
}, new Consumer<Throwable>() {
//倒計(jì)時(shí)錯(cuò)誤的回調(diào)
@Override
public void accept(Throwable throwable) throws Exception {
if (null != tvGetCode) {
tvGetCode.setText(mContext.getString(R.string.get_code));
}
isStartCountDown = false;
}
}, new Action() {
//倒計(jì)時(shí)完成的回調(diào)
@Override
public void run() throws Exception {
if (null != tvGetCode) {
tvGetCode.setText(R.string.get_code);
}
isStartCountDown = false;
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
if (subscription != null && !subscription.isDisposed()) {
subscription.dispose();
}
}
}