绕过概述原理,直接上代码:
public class RxCountDown {
public static Observable<Integer> countdown(int time) {
if (time < 0) time = 0;
final int countTime = time;
return Observable.interval(0, 1, TimeUnit.SECONDS)
.subscribeOn(AndroidSchedulers.mainThread())
.observeOn(AndroidSchedulers.mainThread())
.map(new Func1<Long, Integer>() {
@Override
public Integer call(Long increaseTime) {
return countTime - increaseTime.intValue();
}
})
.take(countTime + 1);
}
}
代码比较简单,利用interval()定时发送Observable,通过map()将0、1、2、3…的计数变为…3、2、1、0倒计时。通过take()取>=0的Observable。
使用时:
RxCountDown.countdown(5)
.doOnSubscribe(new Action0() {
@Override
public void call() {
appendLog("开始计时");
}
})
.subscribe(new Subscriber<Integer>() {
@Override
public void onCompleted() {
appendLog("计时完成");
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Integer integer) {
appendLog("当前计时:" + integer);
}
});