美文网首页安卓Android技术知识Android开发经验谈
用 Handler 轻松实现专属Android定时器

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

作者: 任半生嚣狂 | 来源:发表于2017-12-19 23:34 被阅读294次

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

    相关文章

      网友评论

        本文标题:用 Handler 轻松实现专属Android定时器

        本文链接:https://www.haomeiwen.com/subject/yjrwwxtx.html