通常情况下,我们可以使用CountDownTimer
来优雅的实现时间倒计时,代码如下
<string name="remainder_second">%2ds</string>
<string name="get_code">获取验证码</string>
//当获取验证码成功的时候倒计时开始
CountDownTimer timer = new CountDownTimer(60000, 1000) {
@Override
public void onTick(long millisUntilFinished) {
bt_1.setEnabled(false);
bt_1.setText(getString(R.string.remainder_second, millisUntilFinished / 1000));
}
@Override
public void onFinish() {
bt_1.setEnabled(true);
bt_1.setText(getString(R.string.get_code));
}
};
timer.start();
效果如下:
那么RxJava也可以实现时间倒计时,下面将结合RxBinding
来实现时间倒计时功能。
int maxCount = 10;
RxView.clicks(bt_1)
.flatMap(new Function<Unit, ObservableSource<Integer>>() {
@Override
public ObservableSource<Integer> apply(Unit unit) throws Exception {
bt_1.setEnabled(false);
bt_1.setText(getString(R.string.remainder_second, maxCount));
return Observable.interval(1000, TimeUnit.MILLISECONDS)
.take(maxCount)
.map(new Function<Long, Integer>() {
@Override
public Integer apply(Long aLong) throws Exception {
return maxCount - (aLong.intValue() + 1);
}
});
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<Integer>() {
@Override
public void accept(Integer integer) throws Exception {
Log.d("aaa", "int:"+integer);
if(integer.intValue() == 0){
bt_1.setEnabled(false);
bt_1.setText(getString(R.string.get_code));
}else{
bt_1.setEnabled(false);
bt_1.setText(getString(R.string.remainder_second, integer));
}
}
});