用RxJava实现倒计时与踩坑
2016-06-17 13:35
302 查看
(转载)http://www.jianshu.com/p/17af7790e8a6
废话不多说直接上代码:
代码比较简单,利用
使用时:
这样就实现了一个5秒的倒计时。
运行结果:
WTF……
这么几行代码找了1个小时没找到问题在哪里……后来尝试着把
居然正确了,倒计时正常工作了……
不知道是
希望有知道的不吝赐教。
2016.2.16更新:找到原因了,不是Rx的锅,是我自己编译环境的问题……
文/Hideeee(简书作者)
原文链接: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
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
相关文章推荐
- 《java编程思想》--对象初始化和面向对象特性
- 记录一次线上,ss服务出现大面积不能响应请求:java.io.IOException: Broken pipe
- eclipse集成weblogic开发环境的搭建
- easyui的datagrid整合struts2,以及Ajax,实现局部刷新功能,并设置分页的实现---------投票案例
- java获取对象属性类型、属性名称、属性值
- spring mvc 入门系列之二--HelloWorld(注解版)
- 通用数据库查询分析器Java实现
- eclipse(修改注释作者名称)
- 第四章 Controller接口控制器详解 (4)——跟着开涛学SpringMVC
- Spring与Logback整合
- but no declaration can be found for element 'mvc:resources'(springmvc 常见错误)
- java的引用总结
- java前后台之间传值的几种方式
- 基于Eclipse Maven的Spring4/Spring-MVC/Hibernate4整合之五:Hibernate的事务管理、手动回滚
- 深入springmvc
- java构造树,多级菜单
- spring mvc数据绑定
- JAVA JDK1.5-1.9新特性
- spring注解 总结
- Spring 攻略第004讲