当前位置: 首页 > 编程日记 > 正文

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

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

上面的代码还算好,如果是以 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)//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

转载于:https://juejin.im/post/5a39319bf265da4327185b6c

相关文章:

查看Firefox中的缓存

在firefox浏览器中可以在地址栏使用about:cache命令查看当前缓存。 Information about the Cache Service Disk cache device Number of entries:333Maximum storage size:458708 KiBStorage in use:3685 KiBCache Directory:C:\Documents and Settings\Administrator\Local …

技术大咖齐聚爱数智慧人机交互技术论坛 | CNCC2021

CNCC2021【人机交互技术的机遇与挑战】技术论坛将于2021年10月28日13:00-16:00在深圳国际会展中心CC105B召开&#xff0c;本次论坛由CCF主办&#xff0c;爱数智慧创始人兼CEO张晴晴担任论坛主席&#xff0c;邀请来自产学研各界技术大咖&#xff0c;就人机交互、智能语音技术的应…

响应式网页的布局设计

值得收藏的14款响应式前端开发框架 作为今年大热的设计趋势&#xff0c;响应式已然是设计师的标配技能。今天阿里的同学从响应式设计的布局类型、布局实现两方面深入讲解&#xff0c;有哪些实现布局的方式&#xff0c;该采用何种方式&#xff0c;都有相当专业细致的解答&#x…

halcon算子翻译——set_framegrabber_callback

名称 set_framegrabber_callback - 为图像采集设备注册一个回调函数。 用法 set_framegrabber_callback( : : AcqHandle, CallbackType, CallbackFunction, UserContext : ) 描述 算子set_framegrabber_callback为AcqHandle指定的图像采集设备注册一个回调函数。 参数CallbackF…

设置Sysctl.conf用以提高Linux的性能(最完整的sysctl.conf优化方案)

Sysctl是一个允许您改变正在运行中的Linux系统的接口。它包含一些 TCP/IP 堆栈和虚拟内存系统的高级选项&#xff0c; 这可以让有经验的管理员提高引人注目的系统性能。用sysctl可以读取设置超过五百个系统变量。基于这点&#xff0c;sysctl(8) 提供两个功能&#xff1a;读取和…

AI 天气预报准确度高于气象台,一张 GPU 1秒预测未来 90 分钟天气

编译 | 禾木木 出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09; 此次 DeepMind 聚焦天气预报这一重大挑战&#xff0c;与英国气象局合作将 AI 应用于预测降雨。 在天气现象中&#xff0c;雨尤其重要&#xff0c;因为它会影响我们的日常决策。 我应该带伞吗&#xff1…

33.搜索插件——autocomplete

搜索插件的功能是通过插件的autocomplete()方法与文本框相绑定&#xff0c;当文本框输入字符时&#xff0c;绑定后的插件将返回与字符相近的字符串提示选择&#xff0c;调用格式如下&#xff1a; $(textbox).autocomplete(urlData,[options]); 其中&#xff0c;textbox参数为文…

React Native开源项目如何运行(附一波开源项目)

学习任何技术&#xff0c;最快捷的方法就是学习完基础语法&#xff0c;然后模仿开源项目进行学习&#xff0c;React Native也不例外。React Native推出了1年多了&#xff0c; 开源项目太多了&#xff0c;我们以其中一个举例子.给大家演示下如何运行开源项目.(前提是你已经搭建好…

http header头设置反向代理不缓存

一&#xff1a;概念说明 Expries:网页的cache过期时间&#xff0c;到指定日期网页cache失效 Last-Modified:网页的最新更新时间 Cache-Control 缓存控制 no-cache:不缓存网页 no-store:不缓存网页&#xff0c;如果有则删除之 must-revalidate:使之前&#xff0c;服务器响应使用…

985大学的高材生只会写代码片段,丢人吗?

很多同学在学习编程的时候都会遇到各种各样的难题&#xff0c;比如&#xff1a;没有合适的资料、学习过于碎片化、资料的质量层次不齐、看了很多视频自己动手时却还是不会、接触不到完整项目、无法检测自己的编程水平是不是企业所认可的……最近&#xff0c;小郭和小解同学也遇…

xcode6 dyld_sim is not owned by root

如果运行复制过来的xcode可能会这个提示&#xff0c;xcode6 dyld_sim is not owned by root解决方法打开终端 输入sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer

C语言关闭日志文件时忘了将日志文件全局变量指针置为NULL

C语言写了一个write_log函数以写日志&#xff0c;写了一个close_log_file函数以关闭日志&#xff0c;声明了一个日志文件全局变量文件指针plogFile。 write_log中首先判断plogFile是否为NULL&#xff0c;如果不为NULL&#xff0c;则直接引用plogFile写日志信息&#xff1b; 如果…

DeepMind 的新强化学习系统是迈向通用 AI 的一步吗?

作者 | Ben Dickson来源 | 数据实战派这篇文章是我们对 AI 研究论文评论的一部分&#xff0c;这是一系列探索人工智能最新发现的文章。对于已经精通围棋、星际争霸 2 和其他游戏的深度强化学习模型来说&#xff0c;人工智能系统的主要挑战之一是它们无法将其能力泛化到训练领域…

linux中iptables入门教程--设置静态防火墙

1、iptables介绍iptables是复杂的&#xff0c;它集成到linux内核中。用户通过iptables&#xff0c;可以对进出你的计算机的数据包进行过滤。通过iptables命令设置你的规则&#xff0c;来把守你的计算机网络──哪些数据允许通过&#xff0c;哪些不能通过&#xff0c;哪些通过的…

{好文备份}SQL索引一步到位

SQL索引一步到位&#xff08;此文章为“数据库性能优化二&#xff1a;数据库表优化”附属文章之一&#xff09; SQL索引在数据库优化中占有一个非常大的比例&#xff0c; 一个好的索引的设计&#xff0c;可以让你的效率提高几十甚至几百倍&#xff0c;在这里将带你一步步揭开他…

浅谈SQL Server中统计对于查询的影响

简介SQL Server查询分析器是基于开销的。通常来讲&#xff0c;查询分析器会根据谓词来确定该如何选择高效的查询路线,比如该选择哪个索引。而每次查询分析器寻找路径时&#xff0c;并不会每一次都去统计索引中包含的行数&#xff0c;值的范围等&#xff0c;而是根据一定条件创建…

《Effective C#中文版:改善C#程序的50种方法》读书笔记

一、用属性代替可访问的字段 1、.NET数据绑定只支持数据绑定&#xff0c;使用属性可以获得数据绑定的好处&#xff1b; 2、在属性的get和set访问器重可使用lock添加多线程的支持。 二、readonly&#xff08;运行时常量&#xff09;和const&#xff08;编译时常量&#xff09; …

100行代码,使用 Pygame 制作一个贪吃蛇小游戏!

作者 | 周萝卜来源 | 萝卜大杂烩相信我们大家都玩过贪吃蛇游戏&#xff0c;今天我们就从头一起来写一个贪吃蛇小游戏&#xff0c;只需要100多行的代码就完成了。用到的 Pygame 函数 贪吃蛇小游戏用到的函数功能描述init()初始化 pygamedisplay.set_mode()以元组或列表为参数创建…

Ubuntu + VirtualBox + windows xp互相访问

2019独角兽企业重金招聘Python工程师标准>>> 1 在ubuntu中安装最新版virtualbox&#xff0c;并且同时安装增强插件 2 设置xp网络位桥接网络 3 启动虚拟机中xp系统 4 关闭虚拟机中xp防火墙 virtualbox原来如此的爽&#xff0c;太方便了 第二天到公司使用网络的时候,基…

cocoapods使用教程

#####一、什么是CocoaPods CocoaPods是一个用来帮助我们管理第三方依赖库的工具。 #####二、安装cocoaPods 1.移除现有Ruby默认源 $gem sources --remove https://rubygems.org/ 复制代码2.使用新的源 $gem sources -a https://ruby.taobao.org/ 复制代码3.验证新源是否替…

Memcached安装以及PHP的调用

一&#xff1a;安装libevent 由于memcached安装时&#xff0c;需要使用libevent类库&#xff0c;所以先安装libevent 1.下载 #wget http://www.monkey.org/~provos/libevent-2.0.12-stable.tar.gz 2.解压缩 #tar xzfv libevent-2.0.12-stable.tar.gz 3.进入目录 #cd l…

matplotlib 可视化必知必会富文本绘制方法

作者 | 费弗里来源 | Python大数据分析本文示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes1 简介长久以来&#xff0c;在使用matplotlib进行绘图时&#xff0c;一直都没有比较方便的办法像R中的ggtext那样&#xff0c;向图像中插入整…

Android如何使用读写cookie的方法

http://www.cnblogs.com/cosiray/archive/2012/06/25/2562117.html 可以使用SharedPreferences或者SQLite来保存用户信息 private static HashMap<String,String> CookieContinernew HashMap<String,String>() ;/*** 保存Cookie* param resp*/public void SaveCoo…

js 创建一条通用链表

js 创建一条通用链表什么是「链表科普」&#xff1f;链表是一种物理存储单元上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的。什么是「顺序存储结构科普」&#xff1f;在计算机中用一组地址连续的存储单元依次存储线性表的各个数据…

预训练时代微调新范式,高性能加速2800%,NLPer赶紧看过来!

导读PaddleNLP 是兼具科研学习和产业实践能力的 Python NLP 工具包&#xff0c;提供中文领域丰富的预训练模型和部署工具&#xff0c;被高校、企业开发者广泛应用。近日&#xff0c;PaddleNLP v2.1正式发布&#xff0c;为开发者带来三项重要更新&#xff1a;开箱即用的工业级NL…

图片服务器的url hash架构

什么是urlhash架构 url hash架构对url进行一次hash算法&#xff0c;然后通过hash结果找到对应的服务器。因为针对单一个url的hash结果是一样的&#xff0c;所以理论上这个url会被永久分配到固定的一台服务器上。另外因为经过了hash算法&#xff0c;所以分配url就很均匀&#xf…

Android系统--TouchEvent的处理流程

TouchEvent的处理流程就是TouchEvent在View树中的传递的过程&#xff1a;这个过程分为2步&#xff1a;第一步&#xff0c;ACTION_DOWN在View树中寻找处理TouchEvent的View;第二步&#xff0c;剩余的ACTION_XXX在View树传递给目标View; 第一步&#xff0c;ACTION_DOWN在View树中…

搜索引擎中的URL散列

散列&#xff08;hash&#xff09;也就是哈希&#xff0c;是信息存储和查询所用的一项基本技术。在搜索引擎中网络爬虫在抓取网页时为了对网页进行有效地排重必须对URL进行散列&#xff0c;这样才能快速地排除已经抓取过的网页。最理想的状态是对联网上所有的网页都分配一个哈希…

c++各种数据类型表示范围

符号属性 长度属性 基本型 所占位数 取值范围 输入符举例 输出符举例 -- -- char 8 -2^7 ~ 2^7-1 %c %c、%d、%usigned -- char 8 -2^7 ~ 2^7-1 %c …

原来Python用得好,工作这么好找

Python是多数平台上写脚本和快速开发应用的编程语言&#xff0c;适用场景非常广&#xff0c;Web开发、大数据分析、机器学习、自动化运维/测试&#xff0c;甚至日常工作中的各种各样的问题都能用Python来解决。Python不仅可以批量处理上百个Excel、Word、PDF文件&#xff0c;工…