用 Handler 轻松实现专属Android定时器
16lz
2021-01-26
今年在项目中发现为了实现倒计时、时间段的延迟执行、时间段的轮询执行任务,都是采用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 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
更多相关文章
- Android(安卓)ViewStub 布局延迟加载
- Android5.1.1-APK签名校验分析和修改源码绕过签名校验
- Android项目Tab类型主界面大总结 Fragment+TabPageIndicator+Vie
- android NDK开发中,用Cygwin调试本地代码时报错“Another debug s
- android 给图片加文字、图片水印
- Android(安卓)开发系列视频教程下载
- 逐帧动画入门
- android socket通讯
- Android(安卓)getDrawable返回ColorDrawable而不是BitmapDrawabl
随机推荐
- android Activity间List传值
- Android 消息通知栏Notification使用和权
- Android Property实现介绍
- 如何获得Android的System Bar’s Height
- Could not find gradle wrapper within A
- Android Camera Subsystem - startPrevie
- Android(安卓)studio使用NDK编译和调试(
- android studio获取SH1码
- Android 10 Camera -- 3A Modes and Stat
- 在线看Android系统源码,AndroidXRef的简易