android 编写计时器,Android用5种方式实现自定义计时器, 哪种才是你的菜?
目录
效果图
前言
Timer + TimerTask + Handler
Timer + TimerTask
Handler
Thread + Handler
Handler + Runnable
最后
效果图
看下效果图, 这是五种不同的方式演示计时器. 当然不看源码是看不出差别的.
效果图
前言
这次的文章不知道能不能帮助大家, 但是对我自己的帮助还是蛮大的, 才知道自己原来用的方法不是最优而且也不是最简. 然后我之前有一篇文章是用官方控件和类实现的, 有兴趣可以看一下Chronometer和CountDownTimer计时器.
Timer + TimerTask + Handler
在TimerTask实例的run方法中用Handler实例发送消息, 用Timer实例启动计时器, 从0ms开始, 间隔1000ms.
case R.id.cv_start1:
if (mTimer1 == null && mTask1 == null) {
mTimer1 = new Timer();
mTask1 = new TimerTask() {
@Override
public void run() {
Message message = mHandler.obtainMessage(1);
mHandler.sendMessage(message);
}
};
mTimer1.schedule(mTask1, 0, 1000);
}
break;
case R.id.cv_stop1:
if (mTimer1 != null) {
mTimer1.cancel();
mTimer1 = null;
}
if (mTask1 != null) {
mTask1.cancel();
mTask1 = null;
}
break;
Timer + TimerTask
比起第一种, 这种更Java, 但是可以少一个Handler实例.
if (mTimer2 == null && mTask2 == null) {
mTimer2 = new Timer();
mTask2 = new TimerTask() {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
mTvTime2.setText(getTime());
}
});
}
};
mTimer2.schedule(mTask2, 0, 1000);
}
Handler
这种方法就直接告别Timer和TimerTask了, 通过Handler的发消息延迟sendMessageDelayed以及不同的消息内容(就是what值)解决问题.
case R.id.cv_start3: {
Message message = mHandler.obtainMessage(2);
mHandler.sendMessage(message);
}
break;
case R.id.cv_stop3: {
Message message = mHandler.obtainMessage(3);
mHandler.sendMessage(message);
}
case 2: {
mTvTime3.setText(getTime());
this.removeMessages(2);
Message message = this.obtainMessage(2);
this.sendMessageDelayed(message, 1000);
}
break;
case 3:
this.removeMessages(2);
break;
Thread + Handler
老朋友Thread + Handler, 原来经常这么写, 现在不了(手动滑稽).
/**
* 启动线程
*/
private void startThread() {
if (mThread == null) {
mThread = new MyThread();
mThread.start();
}
}
/**
* 停止线程
*/
private void stopThread() {
if (mThread != null) {
mThread.stop = true;
mThread = null;
Message message = mHandler.obtainMessage(5);
mHandler.sendMessage(message);
}
}
Handler + Runnable
最后一种我目前最喜欢. 你连what值都无需处理, 直接postDelayed设置时延, 然后交给实现Runnable接口的实例的run方法来做.
case R.id.cv_start5: {
if (mRunnable == null) {
mRunnable = new MyRunnable();
mHandler.postDelayed(mRunnable, 0);
}
}
break;
case R.id.cv_stop5: {
mHandler.removeCallbacks(mRunnable);
mRunnable = null;
}
break;
private class MyRunnable implements Runnable {
@Override
public void run() {
mTvTime5.setText(getTime());
mHandler.postDelayed(this, 1000);
}
}
最后
总之一点, 用第三种Handler和第五种Handler + Runnable肯定比其它的消耗少得多, 所以很推荐. 或者你还有更棒的方法可以评论区告诉我下. 喜欢记得点赞, 暗中关注我也是可以的哦~
android 编写计时器,Android用5种方式实现自定义计时器, 哪种才是你的菜?相关推荐
- android圆形点击效果,Android 三种方式实现自定义圆形页面加载中效果的进度条
[实例简介] Android 三种方式实现自定义圆形页面加载中效果的进度条 [实例截图] [核心代码] ad376a86-a9aa-49bc-8cea-321bcff2c0c3 └── AnimRou ...
- Java 创建对象的 6 种方式,总有一种适合你
创建对象的 6 种方式 假设有个女朋友类: @Data @NoArgsConstructor @AllArgsConstructor class GirlFriend {private String ...
- Android:按键响应方式第一种onClick属性,第二种方法接口类,第三种方式匿名内部类,第四种方式Activity
一.在xml 中设置按键的onClick 绑定的函数 新建一个工程 然后在相关的页面添加一个Button 运行一下 实际上,现在这个按键一,我们去运行的时候,他是没有任何的反馈的,我们按完它,他没有任 ...
- Android 三种方式实现自定义圆形页面加载中效果的进度条
转载:http://www.eoeandroid.com/forum.php?mod=viewthread&tid=76872 一.通过动画实现 定义res/anim/loading.xml如 ...
- 三种方式实现自定义圆形进度条ProgressBar
2019独角兽企业重金招聘Python工程师标准>>> 一.通过动画实现 定义res/anim/loading.xml如下: [html] view plain copy print ...
- 连接mysql数据库有几种方式_数据库连接的几种常用方式
在上一讲中,讲解了数据库的大概种类和特点,这些和我们VBA的知识离得远些,我们要用到只是其中的一点点就可以了.那么,要想操作数据库,首先要做的是什么呢?对了,就是要首先连接到这个数据库(我们先假设有这 ...
- vue 实例化几种方式_Vue组件的三种调用方式
最近在写fj-service-system的时候,遇到了一些问题.那就是我有些组件,比如Dialog.Message这样的组件,是引入三方组件库,比如element-ui这样的,还是自己实现一个?虽然 ...
- unity3d中画线有几种方式_Spring RestTemplate中几种常见的请求方式
原文 https://segmentfault.com/a/1190000011093597 在Spring Cloud中服务的发现与消费一文中,当我们从服务消费端去调用服务提供者的服务的时候,使用了 ...
- html中引入css样式表的三种方式,css引用的几种方式是什么?
HTML怎么引用CSS样式?css引用的几种方式是什么?下面本篇文章就来给大家介绍一下在HTML中引用CSS样式的几种方法,希望对大家有所帮助. 1.行内式 在HTML标签中,使用style属性设置C ...
- python函数调用的三种方式_python函数调用的四种方式
原标题:python函数调用的四种方式 第一种:参数按顺序从第一个参数往后排#标准调用 运行结果: 第二种:#关键字调用 注意:关键调用从哪开始的,从哪以后都必须使用关键字调用除了'*'收集参数.不能 ...
最新文章
- rpath和runpath的区别
- WPF 中动态创建和删除控件
- 【django】配置redis数据库【4】
- HDU 6029(思维)
- 织梦同步静态文件到服务器,某猫织梦插件-织梦dedecms静态文件生成速度的区块插件...
- 函数指针史上最全的介绍
- 手把手教你如何用 TensorFlow 实现基于 DNN 的文本分类
- HDU 3785 寻找大富翁
- vue-quasar-admin 一个包含通用权限控制的后台管理系统
- 爬取百度贴吧发帖信息并保存到scv文件中
- java 全量_七、通过java代码实现增量、全量索引
- 树莓派运行python命令_《树莓派Python编程入门与实战》——2.2 使用Raspbian命令行...
- 电容式压力传感器分类与原理
- 这些那些非代码之罪的坑
- 开源或免费虚拟主机管理系统
- 3d打印材料有哪几种
- 梅科尔工作室E1-张冉-鸿蒙笔记4
- IPsec+预共享密钥的IKE野蛮模式
- 坎坷的微信小程序【笔记】
- 1.5 日本の会社で働くのは、初めてなので、不安です