用RxJava实现倒计时与踩坑
来源:互联网 发布:微加粉软件免费 编辑:程序博客网 时间:2024/06/05 01:06
(转载)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
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
原文链接:http://www.jianshu.com/p/17af7790e8a6
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
0 0
- 用RxJava实现倒计时与踩坑
- 使用RxJava实现倒计时
- Rxjava 实现倒计时的方法
- android中使用Rxjava实现倒计时功能
- RxJava倒计时
- 用Handler与Timer实现progressDialog倒计时
- 使用RxJava实现android里面的倒计时效果
- RxJava之倒计时
- RxJava Android倒计时
- JQuery与JS实现倒计时
- RxJava 与OKHttpClient实现登陆
- 用jQuery实现倒计时
- 用RxJava实现RxBus
- 利用RxJava和 RxBinding实现倒计时按钮、关键词搜索和按钮防抖效果
- 实现Android计时与倒计时方法
- 实现Android计时与倒计时方法
- PHP验证码实现与倒计时
- Android实现计时与倒计时方法
- 文本分析--潜在语义分析 之 建立词项-文档矩阵
- linux查看硬件信息、cpu、内存、操作系统、发行版本、机器型号、网卡信息等
- Oracle11g服务器端和客户端安装到同一服务器中需要注意的问题
- 如何在PowerPoint中添加背景音乐
- Maven环境的搭建与idea配置
- 用RxJava实现倒计时与踩坑
- 浅谈HTTP中Get与Post的区别
- ZBrush中的SubTool工具该怎样使用
- swift 二维码扫描
- js传参写法
- 关于NSAutoreleasePool' is unavailable: not available in automatic reference counting mode的解决方法 .
- Android中Selsetor基本使用二,选中时改变按钮背景
- DB2数据库设置归档模式
- 图像处理方向常用网站