/**
* 开启倒计时。传入间隔时间,次数
* @param time
* @param sum
*/
private void startTimer(long time, int sum) {
Observable.interval(time, TimeUnit.MILLISECONDS)
.take(sum)
.map(aLong -> String.valueOf(sum - aLong))
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<String>() {
@Override
public void onSubscribe(Disposable d) {
disposable = d;
}
@Override
public void onNext(String s) {
//我们一般会选择将相应的时间直接设置到tv上,所以这里使用map转型
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
openClick();
setTvCode("获取验证码");
}
});
//最后不要忘记临时中断或者使用结束时取消订阅
public void onDestroy() {
if (disposable != null && !disposable.isDisposed()) {
Log.e("demo", "关闭");
disposable.dispose();
disposable = null;
}
}
其实上面的写法我们还可以更进一步简略:
//简略写法,是不是特别简单
private void startTimer(long time,int count) {
disposable = Observable.timer(time, TimeUnit.MILLISECONDS)
.take(count+1)
.map(aLong -> String.valueOf(count - aLong))
.observeOn(AndroidSchedulers.mainThread())
.doOnNext(this::setTvCode)
.doOnComplete(this::openClick).subscribe();
}
接下来我们看看效果:
更多Rx实用技巧及全面解析我会在以后的学习中慢慢记录,有更好的使用建议也欢迎随时评论。