最近鼓捣了一个模仿手机底层的闹钟 需要在设置完闹钟时间之后在另一个页面提示距离闹钟响还有多长时间,而且还是个倒计时,所以用到了rxjava中的倒计时 为什么会想到这个RxJava呢因为它是异步实现,通过一种扩展的观察者模式来实现的,并且代码简洁
首先肯定是需要build.gradle配置的
我这里用的引入的是
compile 'io.reactivex:rxjava:1.1.0'
compile 'io.reactivex:rxandroid:1.1.0'
仅是这样就好就可以继续代码了
private void getSleepTimeCountDown(final int sleepTime1, final TextView tvSleepPagerSleepTime) {
subscription = Observable.interval(0, 1, TimeUnit.SECONDS).subscribeOn(Schedulers.computation())
.map(new Func1<Long, Integer>() {
@Override
public Integer call(Long aLong) {
return sleepTime1 - aLong.intValue();
}
})
.observeOn(AndroidSchedulers.mainThread())
.take(sleepTime1 + 1)
.subscribe(new Subscriber<Integer>() {
@Override
public void onCompleted() {
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
onResume();
}
}, 60000);//3秒后执行Runnable中的run方法
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Integer integer) {
if (integer != 0) {
tvSleepPagerSleepTime.setText("预计睡眠:" + getTimeFromInt(integer));
}
}
});
}
这是倒计时的主要方法其中的两个参数第一个参数是时间在这里我是int类型的时间精确到秒的 第二个参数是倒计时的时间需要显示在哪个控件上
getTimeFromInt(integer)这个方法是倒计时的具体显示方式
public static String getTimeFromInt(int time) {
int hour = time/3600;
int secondnd = (time -hour*3600) / 60;
int million = (time -hour*3600 - secondnd*60) % 60;
if (hour ==24 && secondnd ==60){
return "";
}else{
return hour+"小时"+secondnd + "分" + million + "秒";
}
}
这样倒计时就实现了,还有一个问题就是我们倒计时那假如倒计是还有2小时30分钟29秒的时候我们的时间的换了一个呢,正常来说这个异步的我们已经开启了况且还没有complete我们需要怎么中止呢,我们一定要先中止才能再开始倒计时下一个,否则会出现,上一个倒计时时间和下一个倒计时时间两个时间相互跳蹿的情况
反正我是遇到了这种情况
我的解决办法是在下一次倒计时之前将之间的订阅subscription取消就好了
/**
* 取消订阅
*/
public static void cancel(){
if(mSubscription!=null&&!mSubscription.isUnsubscribed()){
mSubscription.unsubscribe();
}
}
这样就可以了,希望可以帮到大家
参考文献:http://m.blog.csdn.net/Burn_yourself/article/details/72457502