您的位置:首页 > 编程语言 > Java开发

用RxJava实现倒计时与踩坑

2016-06-17 13:35 302 查看
(转载)http://www.jianshu.com/p/17af7790e8a6

废话不多说直接上代码:

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);
}
});

这样就实现了一个5秒的倒计时。

运行结果:

D/HIDETAG: <--  当前时间:07分58秒628 --- 开始计时  -->
D/HIDETAG: <--  当前时间:07分59秒646 --- 当前计时:5  -->
D/HIDETAG: <--  当前时间:07分59秒647 --- 当前计时:4  -->
D/HIDETAG: <--  当前时间:08分00秒646 --- 当前计时:3  -->
D/HIDETAG: <--  当前时间:08分01秒646 --- 当前计时:2  -->
D/HIDETAG: <--  当前时间:08分02秒645 --- 当前计时:1  -->
D/HIDETAG: <--  当前时间:08分03秒646 --- 当前计时:0  -->
D/HIDETAG: <--  当前时间:08分03秒650 --- 计时完成  -->

WTF……
5
4
怎么同时执行了!反倒是
doOnSubscribe()
计时5
之间有1秒的间隔,很明显有BUG。

这么几行代码找了1个小时没找到问题在哪里……后来尝试着把
.subscribeOn(AndroidSchedulers.mainThread())
删除,然后又运行了一下:

D/HIDETAG: <--  当前时间:14分58秒142 --- 开始计时  -->
D/HIDETAG: <--  当前时间:14分58秒162 --- 当前计时:5  -->
D/HIDETAG: <--  当前时间:14分59秒163 --- 当前计时:4  -->
D/HIDETAG: <--  当前时间:15分00秒150 --- 当前计时:3  -->
D/HIDETAG: <--  当前时间:15分01秒150 --- 当前计时:2  -->
D/HIDETAG: <--  当前时间:15分02秒149 --- 当前计时:1  -->
D/HIDETAG: <--  当前时间:15分03秒150 --- 当前计时:0  -->
D/HIDETAG: <--  当前时间:15分03秒151 --- 计时完成  -->

居然正确了,倒计时正常工作了……

不知道是
Rx
的BUG还是我漏掉了什么知识,为什么指定
subscribe
的线程为主线程会导致第一次计时不准确?


希望有知道的不吝赐教。

2016.2.16更新:找到原因了,不是Rx的锅,是我自己编译环境的问题……

文/Hideeee(简书作者)

原文链接:http://www.jianshu.com/p/17af7790e8a6

著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: