转载自这位大哥的:http://blog.csdn.net/qq_33375419/article/details/56479994?locationNum=6&fps=1
/**
* 使用RxJava实现倒计时
*/
private void countDown() {
final long count = 30;
Observable.interval(1, TimeUnit.SECONDS)
.take(31)//计时次数
.map(new Func1<Long, Long>() {
@Override
public Long call(Long integer) {
return count - integer;
}
})
.doOnSubscribe(new Action0() {
@Override
public void call() {
cutdown.setEnabled(false);
cutdown.setBackgroundColor(Color.DKGRAY);
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<Long>() {
@Override
public void onCompleted() {
cutdown.setEnabled(true);
cutdown.setBackgroundColor(getResources().getColor(R.color.colorPrimary));
cutdown.setText("倒计时");
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Long aLong) {
cutdown.setText("倒计时" + aLong);
}
});
}
其中take操作符:
take操作符和interval操作符联合使用,由于一旦interval计时开始除了解绑就无法停止,所以只有在onNext方法中计算一旦释放到30秒的时候再进行解绑从而终结该计时。但使用take操作符就简单很多了,它的意思是只释放前N项,和计时配合使用的话,就可以不用担心计时会一直执行,10秒过后它会自动结束。