今年在项目中发现为了实现倒计时、时间段的延迟执行、时间段的轮询执行任务,都是采用Handler postDelayed(runnable,delayMillis). 等等,这有毛病?那你将实现以上功能时、代码大概如下。
Handler handler = new Handler();
int countDown = 30;
Runnable r = new Runnable() {@Overridepublic 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)//tagtag(String tag)//任务执行完成CallBackaccept(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>() {@Overridepublic void accept(Long aLong) throws Exception {updateCancelLaunchButton(aLong);}}, new Action() {@Overridepublic void run() throws Exception {performLaunchButtonClick();}}).start();
复制代码
哈哈,是不是好看多了!!代码不一一列出了,参照我? GitHub上的Demo 实现,还有Kotlin 的实现呢
AndroidDeveloperTools