今年在项目中发现为了实现倒计时、时间段的延迟执行、时间段的轮询执行任务,都是采用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 longConsumer)          accept(Consumer 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() {                    @Override                    public void accept(Long aLong) throws Exception {                        updateCancelLaunchButton(aLong);                    }                }, new Action() {                    @Override                    public void run() throws Exception {                        performLaunchButtonClick();                    }                }).start();

哈哈,是不是好看多了!!代码不一一列出了,参照我�� GitHub上的Demo 实现,还有Kotlin 的实现呢

AndroidDeveloperTools

更多相关文章

  1. Android(安卓)ViewStub 布局延迟加载
  2. Android5.1.1-APK签名校验分析和修改源码绕过签名校验
  3. Android项目Tab类型主界面大总结 Fragment+TabPageIndicator+Vie
  4. android NDK开发中,用Cygwin调试本地代码时报错“Another debug s
  5. android 给图片加文字、图片水印
  6. Android(安卓)开发系列视频教程下载
  7. 逐帧动画入门
  8. android socket通讯
  9. Android(安卓)getDrawable返回ColorDrawable而不是BitmapDrawabl

随机推荐

  1. android Activity间List传值
  2. Android 消息通知栏Notification使用和权
  3. Android Property实现介绍
  4. 如何获得Android的System Bar’s Height
  5. Could not find gradle wrapper within A
  6. Android Camera Subsystem - startPrevie
  7. Android(安卓)studio使用NDK编译和调试(
  8. android studio获取SH1码
  9. Android 10 Camera -- 3A Modes and Stat
  10. 在线看Android系统源码,AndroidXRef的简易