用 Handler 轻松实现专属Android定时器

今年在项目中发现为了实现倒计时、时间段的延迟执行、时间段的轮询执行任务,都是采用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);

上面的代码还算好,如果是以 handleMessagesendEmptyMessageDelayed 再通过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 的实现呢

AndroidDeveloperTools

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值