在Android中实现倒计时的方法很多,可以通过Handler,Timer,CountDownTimer等。
通过Timer和Handler的方式太简单了,这里就不做解释了,先写一个用CountDownTimer实现的代码,然后再写RxJava实现的方式。
CountDownTimer类的介绍就是:安排倒计时知道将来一段时间,并在这段时间中定时通知。CountDownTimer是一个抽象类就是让我实现得到通知时的操作和倒计时完成的操作,其实都很好理解,直接上代码:
//第一个参数为总的时间:单位毫秒,第二个参数为时间间隔:单位毫秒 CountDownTimer countDownTimer = new CountDownTimer(1000 * 10,1000) { @Override public void onTick(long millisUntilFinished) { Log.e(TAG,"millisUntilFinished = " + millisUntilFinished); } @Override public void onFinish() { Log.e(TAG,"onFinish"); } }; countDownTimer.start();
这段代码的效果图
可能你会发现在通知回调的时候他的时间是并不是正好的一秒一回调,这个跟代码在执行时也是需要时间。
下面就是我们的主菜,通过RxJava实现的倒计时的代码了。
//interval 是会无限发送事件的。第一个参数开始的延时事件,二个参数为时间间隔,三个时间间隔单元(单位) Observable.interval(0,1, TimeUnit.SECONDS) //因为interval是无限发送的,所以使用take操作符,只会发送10个数据 .take(10) //因为interval发送是从0开始的,而我们要使用的是10 - value 所以用map做一下转换 .map(new Function<Long, Long>() { @Override public Long apply(Long value) throws Exception { return 10 - value; } }) //这个操作是一个耗时操作不能在主线程中执行,就切换到其他线程 .subscribeOn(Schedulers.io()) //得到数据切换到主线程,做改变页面的显示操作 .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<Long>() { @Override public void onSubscribe(Disposable d) { } @Override public void onNext(Long aLong) { mCountText.setText(String.valueOf(aLong)); } @Override public void onError(Throwable e) { e.printStackTrace(); } @Override public void onComplete() { Log.e(TAG,"onComplete"); } });
倒计时的另一种写法:
/** * intervalRange 发送固定个数的事件 * 第一个参数:开始值 * 第二个参数:事件数量 * 第三个参数:开始发送时的延迟时间 * 第四个参数:时间间隔 * 第五个参数:时间单元 */ Observable.intervalRange(0,10,0,1,TimeUnit.SECONDS) .map(new Function<Long, Long>() { @Override public Long apply(Long aLong) throws Exception { return 10-aLong; } }) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<Long>() { @Override public void onSubscribe(Disposable d) { } @Override public void onNext(Long aLong) { mCountText.setText(String.valueOf(aLong)); } @Override public void onError(Throwable e) { e.printStackTrace(); } @Override public void onComplete() { Log.e(TAG,"onComplete"); } });