目录

效果图

前言

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种方式实现自定义计时器, 哪种才是你的菜?相关推荐

  1. android圆形点击效果,Android 三种方式实现自定义圆形页面加载中效果的进度条

    [实例简介] Android 三种方式实现自定义圆形页面加载中效果的进度条 [实例截图] [核心代码] ad376a86-a9aa-49bc-8cea-321bcff2c0c3 └── AnimRou ...

  2. Java 创建对象的 6 种方式,总有一种适合你

    创建对象的 6 种方式 假设有个女朋友类: @Data @NoArgsConstructor @AllArgsConstructor class GirlFriend {private String ...

  3. Android:按键响应方式第一种onClick属性,第二种方法接口类,第三种方式匿名内部类,第四种方式Activity

    一.在xml 中设置按键的onClick 绑定的函数 新建一个工程 然后在相关的页面添加一个Button 运行一下 实际上,现在这个按键一,我们去运行的时候,他是没有任何的反馈的,我们按完它,他没有任 ...

  4. Android 三种方式实现自定义圆形页面加载中效果的进度条

    转载:http://www.eoeandroid.com/forum.php?mod=viewthread&tid=76872 一.通过动画实现 定义res/anim/loading.xml如 ...

  5. 三种方式实现自定义圆形进度条ProgressBar

    2019独角兽企业重金招聘Python工程师标准>>> 一.通过动画实现 定义res/anim/loading.xml如下: [html] view plain copy print ...

  6. 连接mysql数据库有几种方式_数据库连接的几种常用方式

    在上一讲中,讲解了数据库的大概种类和特点,这些和我们VBA的知识离得远些,我们要用到只是其中的一点点就可以了.那么,要想操作数据库,首先要做的是什么呢?对了,就是要首先连接到这个数据库(我们先假设有这 ...

  7. vue 实例化几种方式_Vue组件的三种调用方式

    最近在写fj-service-system的时候,遇到了一些问题.那就是我有些组件,比如Dialog.Message这样的组件,是引入三方组件库,比如element-ui这样的,还是自己实现一个?虽然 ...

  8. unity3d中画线有几种方式_Spring RestTemplate中几种常见的请求方式

    原文 https://segmentfault.com/a/1190000011093597 在Spring Cloud中服务的发现与消费一文中,当我们从服务消费端去调用服务提供者的服务的时候,使用了 ...

  9. html中引入css样式表的三种方式,css引用的几种方式是什么?

    HTML怎么引用CSS样式?css引用的几种方式是什么?下面本篇文章就来给大家介绍一下在HTML中引用CSS样式的几种方法,希望对大家有所帮助. 1.行内式 在HTML标签中,使用style属性设置C ...

  10. python函数调用的三种方式_python函数调用的四种方式

    原标题:python函数调用的四种方式 第一种:参数按顺序从第一个参数往后排#标准调用 运行结果: 第二种:#关键字调用 注意:关键调用从哪开始的,从哪以后都必须使用关键字调用除了'*'收集参数.不能 ...

最新文章

  1. rpath和runpath的区别
  2. WPF 中动态创建和删除控件
  3. 【django】配置redis数据库【4】
  4. HDU 6029(思维)
  5. 织梦同步静态文件到服务器,某猫织梦插件-织梦dedecms静态文件生成速度的区块插件...
  6. 函数指针史上最全的介绍
  7. 手把手教你如何用 TensorFlow 实现基于 DNN 的文本分类
  8. HDU 3785 寻找大富翁
  9. vue-quasar-admin 一个包含通用权限控制的后台管理系统
  10. 爬取百度贴吧发帖信息并保存到scv文件中
  11. java 全量_七、通过java代码实现增量、全量索引
  12. 树莓派运行python命令_《树莓派Python编程入门与实战》——2.2 使用Raspbian命令行...
  13. 电容式压力传感器分类与原理
  14. 这些那些非代码之罪的坑
  15. 开源或免费虚拟主机管理系统
  16. 3d打印材料有哪几种
  17. 梅科尔工作室E1-张冉-鸿蒙笔记4
  18. IPsec+预共享密钥的IKE野蛮模式
  19. 坎坷的微信小程序【笔记】
  20. 1.5 日本の会社で働くのは、初めてなので、不安です

热门文章

  1. 发光二极管pcb封装图画法_电子电工如何判断发光二极管正负极,工程师教你7种方法,长见识...
  2. 如何去做一个完整的网站SEO优化方案!
  3. 外贸最全出口流程,外贸必看基础知识
  4. 使用FreeCAD进行零件建模
  5. MapReduce实现商品推荐算法(用户购买向量*商品同现矩阵)
  6. TARA-Asset穷举
  7. x265中的lookahead
  8. 每天学习十分钟4之工作记录
  9. GSM模块_GSM设备和网络错误代码
  10. Let's encrypt 通配域名(二级, 三级)