今年在项目中发现为了实现倒计时、时间段的延迟执行、时间段的轮询执行任务,都是采用Handler postDelayed(runnable,delayMillis). 等等,这有毛病?那你将实现以上功能时、代码大概如下。
Handler handler = new Handler();
int countDown = 30;
Runnable r = new Runnable() {
@Override
public void run() {
while (countDown>0){
handler.postDelayed(r,1);
countDown--;
}
}};
handler.postDelayed(r,0);
上面的代码还算好,如果是以 handleMessage
、sendEmptyMessageDelayed
再通过removeMessages
/removeCallbacks
去取消,这样的代码一大堆、追踪代码时,跳来跳去的。
这时我就想到了RxJava 的好了,难道为了这要加入RxJava?
所以, RxJava 好在哪?就好在简洁,好在那把什么复杂逻辑都只是一条链式调用。
因此把上面代码封装一个 HandlerTaskTimer 工具类,大概伪编码
class HandlerTaskTimer{
//成员变量
Handler uiHandler;
//因为要链式调用,顺带采用构建者模式初始化必要参数
Builder newBuilder()
class Builder{
//一段时间后执行
period(long period, TimeUnit unit)
/**
* @param period 一段时间后执行
* @param initialDelay 首次延迟执行时间
* @param unit
* @return
*/
period(long period, long initialDelay, TimeUnit unit)
//首次延迟执行时间
initialDelay(long period, TimeUnit unit)
//takeWhile 倒计时Count
takeWhile(long takeWhile)
//tag
tag(String tag)
//任务执行完成CallBack
accept(Action action)
//倒计时回调
accept(Consumer<Long> longConsumer)
accept(Consumer<Long> longConsumer, Action action)
//倒计时模式任务
countDown()
//循环模式任务
loopExecute()
//延迟模式任务
delayExecute()
//启动任务
start()
//取消任务
cancel()
//恢复任务
resume()
//暂停任务
pause()
}
}
接下来就慢慢实现功能了,条条大路通罗马,也许你有更好的实现方式,以下是我本人的简单实现十分轻巧的定时任务器。
HandlerTaskTimer.getInstance().newBuilder()
.tag(TAG_COUNTDOWN)
.period(1, TimeUnit.SECONDS)
.takeWhile(LauncherActivity.DELAY_LAUNCH_DEFAULT)
.countDown()
.accept(new Consumer<Long>() {
@Override
public void accept(Long aLong) throws Exception {
updateCancelLaunchButton(aLong);
}
}, new Action() {
@Override
public void run() throws Exception {
performLaunchButtonClick();
}
}).start();
哈哈,是不是好看多了!!代码不一一列出了,参照我👇 GitHub上的Demo 实现,还有Kotlin 的实现呢