Timer+TimerTask实现数字时钟

article/2025/8/30 9:49:54

成果展示

 

布局

布局主题背景颜色采用#000000(纯黑色),各TextView字体颜色采用#FFFFFF(纯白色)。

使用五个TextView,分别实现小时:分钟,秒钟,am,pm,周日,具体日期几个数值。

默认布局

约束关系

 

对于几个TextView的位置布局,我们依靠一个非常实用的方法:约束关系(ConstraintLayout)。

  • 默认布局,依靠约束关系来确定位置

  • 能够灵活定位和调整界面元素的大小

  • 无任何嵌套,减少布局层级,优化渲染性能

  • 能完全代替其他布局

 

 

 

 

通过约束关系,组件布局将变得无比easy~

功能实现

使用Timer+TimerTask完成数字时钟,首先创建几个Timer和TimerTask的对象。

 Timer htimer = new Timer()           //创建时分计时器TimerTask hourtask = new TimerTask(){//创建时分计时任务--子线程public void run(){...      }};

我们在布局中使用的是五个TextView,实现时钟需要使用setText()函数,所以我们需要在TimerTask中创建TextView对象。

 TextView tv1 = (TextView) findViewById(R.id.hourshow);

并使用findViewById根据id值绑定组件。

如何获得实时的时间数据?有两个很好的日期API可以实现。

Calendar类

首先,我们使用Calendar自带的getInstance()函数获得实例。

 //获得Calendar这个类的实例:private Calendar c = Calendar.getInstance();

然后就可以通过实例c,使用get()函数去获得我们想要的数据,例如这里获取时分。

 int hour = c.get(Calendar.HOUR_OF_DAY);int minute = c.get(Calendar.MINUTE);

然后时分已经被hour和minute捕获了,我们只需要将时间传给TextView。

 tv1.setText(String.format("%02d:%02d",hour,minute));

注意,从Calendar中get到的数据都是int型,我们这里要转化为String型再传输。类似时分,可以分别完成其他几项数据。

但还有一个更好用的API。

SimpleDateFormat类

SimpleDateFormat是Java中用于格式化日期和时间的类。它提供了一种将日期和时间格式化为特定样式的方式,使其可以更好地与用户界面交互或存储在数据库中。

我们先创建一个SimpleDateFormat对象dateFormat。

 SimpleDateFormat dateFormat = new SimpleDateFormat("HH : mm", Locale.CHINA);

"HH : mm":这个参数是一个字符串,其中HH和mm都是API自带的参数,HH表示显示两位小时,mm表示显示两位分钟;

Locale.CHINA:这个参数是一个Locale对象,指定格式化的语言环境,这里我们选择CHINA,即中文环境。

接下来,我们使用以下语句将当前时间格式化为上午下午时间格式的字符串:

 String currentTime = dateFormat.format(new Date());

在Java中,可以使用new Date()来创建一个表示当前时间的Date对象。当这个语句被执行时,它会调用系统时钟来获取当前时间,并将其封装为一个Date对象。

这里,我们使用了SimpleDateFormat的format()方法,将一个Date对象(表示当前时间)格式化为一个字符串。该方法返回一个String对象,包含指定格式的日期和时间字符串。

最后通过TextView使用setText函数即可实现功能,故此不再演示。

下面是SimpleDateFormat类部分参数对应的细节:

字母日期/时间元素表示示例
GEra标志符AD
yYear1996; 96
M年中的月份MonthJuly; Jul; 07
w年中的周数Number27
W月份中的周数Number2
D年中的天数Number189
d月份中的天数Number10
F月份中的星期Number3
E星期中的天数TextTuesday; Tue
aAm/pm 标记TextPM
H一天中的小时Number (0-23)0
k一天中的小时Number (1-24)24
Kam/pm 中的小时Number (0-11)0
ham/pm 中的小时Number (1-12)12
m小时中的分钟Number30
s分钟中的秒数Number55
S毫秒数Number978
z时区General time zonePacific Standard Time; PST; GMT-08:00
Z时区RFC 822 time zone-0800

注意:大写HH 24小时,小写hh 12小时

TimerTask与runOnUiThread()

我们已经获得了实时的时间数据,并实时传值给了TextView组件,但是现在我们将代码运行,会看见一晃而过的日期,以及我们最讨厌的意外——闪退

为什么呢?

——Android规定只有主线程才能更新UI,在TimerTask线程中是不能直接更新UI的,但可调用runOnUiThread方法将一个Runnable子线程任务放到主线程中执行。

所以一开始我们的TimerTask对象hourtask就遗留了问题。

 Timer htimer = new Timer()           //创建时分计时器TimerTask hourtask = new TimerTask(){//创建时分计时任务--子线程public void run(){...     //这里应该写一个runOnUiThread()函数 }};

那我们就通过runOnUiThread写一个new Runnable()进去吧。

     TimerTask hourtask = new TimerTask() {         //时钟@Overridepublic void run() {runOnUiThread(new Runnable() {@Overridepublic void run() {TextView tv1 = (TextView) findViewById(R.id.hourshow);SimpleDateFormat dateFormat = new SimpleDateFormat("HH : mm", Locale.CHINA);String currentTime = dateFormat.format(new Date());tv1.setText(currentTime);}});}};

一个完美的函数就这样写出来了。

然后我们就只需要在onCreate也就是我们最重要的函数中,完成hourtask的运用。

     protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);htimer.schedule(hourtask, 0, 1000);}
 htimer.schedule(hourtask, 0, 1000);timer.schedule(task, delay, period);

schedule是Timer的调度函数,0(delay)是经过0毫秒后执行一次hourtask任务,1000(period)是从经过0(delay)毫秒秒后,每隔1000(period)毫秒执行一次hourtask任务,并且是多次、重复执行的。

这里就是运行程序后,0毫秒就开始,然后每隔1秒更新一下数据。

最后,别忘了写一个onDestroy()函数。

    @Overrideprotected void onDestroy() {super.onDestroy();htimer.cancel();}}

cancle()可以停止计时器。


http://chatgpt.dhexx.cn/article/gHRducmn.shtml

相关文章

Timer + TimerTask 实现数字时钟

任务: 自己完成的: 遇到的问题: 1.Android Studio 中 calendar设置系统时区无效的问题 14:50它显示为06:50,时间显示错误,这是因为时区不同。 在8.0以后设置时区,有所改动&#xf…

java定时器-Timer和TimerTask详解

1、例子入手 package pers.growing.test;import java.util.Timer; import java.util.TimerTask;public class Main {/*** 延迟100ms后,间隔1s打印出:hello world** param args* throws InterruptedException*/public static void main(String[] args) t…

定时器Timer与TimerTask的使用

一:简介 在JDK类库中Timer主要负责计划任务的功能,也就是在指定时间执行某一任务,执行时候会在主线程之外起一个单独的线程执行指定的任务。该类主要是设置任务计划,但封装的类是TimerTask类。 TimerTask是一个实现了Runnable接口…

Java的定时器Timer和定时任务TimerTask应用以及原理简析

记录:272 场景:Java JDK自带的定时器Timer和定时任务TimerTask应用以及原理简析。在JDK工具包:java.util中可以找到源码,即java.util.Timer和java.util.TimerTask。TimerTask实现Runnable接口的run方法。Timer的属性TimerThread …

原码、补码、反码的转换

1.原码 (1)一个正数,他的原码就是它对应的二进制数字。 (2)一个负数,按照绝对值大小转换成的二进制数,然后最高位补1,就是负数的原码。 2.反码 (1)正数的反…

原码、补码、反码的关系

一. 机器数和真值 在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念. 1、机器数 一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1. 比如,十进制中的数 3 &…

原码,反码,补码,阶码,移码

本文转载自本站大佬“不去上课”,原文链接https://blog.csdn.net/ruidianbaihuo/article/details/87875178 原码,反码,补码,阶码,移码是什么?有什么区别(讨论机器数的表示) 本文内容参考自王达老师的《深入理解计算机…

原码、反码、补码之间的转换和简单运算

一、正整数的原码、反码、补码完全一样,即符号位固定为0,数值位相同 二、负整数的符号位固定为1,由原码变为补码时,规则如下: 1、原码符号位1不变,整数的每一位二进制数位求反,得到反码 2、反码…

原码,反码,补码的概念

计算机里都是以补码的形式存储数据,电脑只能识别二进制的0和1, 一个字节(8位)为例 原码 :最高位符号位,0代表正数,1代表负数,非符号位为该数字绝对值的二进制。 反码:正…

C语言——原码, 反码, 补码 详解

目录 一. 机器数和真值 1、机器数 2、真值 二. 原码, 反码, 补码的基础概念和计算方法. 1. 原码 2. 反码 3. 补码 三. 为何要使用原码, 反码和补码 四 原码, 反码, 补码 再深入 同余的概念 负数取模 开始证明 一. 机器数和真值 在学习原码, 反码和补码之前, 需要先…

原码、反码、补码、移码的概念及转换

目录 前言 1.原码 2.反码 3.补码 4.移码 前言 学习完数的小数点表示,下一个需要解决的问题就是数的机器码表示问题。 在计算机中对数据进行运算操作时,符号位应该如何表示?是否也同数值位一道参加运算操作呢?如果参加&…

mt7620芯片处理器核心资料

MT7620产品系统整合了2T2R 802.11n Wi-Fi 收发器、580MHz MIPS 24KEc™ 中央处理器 (CPU)、5 端口高速以太网络端口物理层 (Ethernet PHY)、HNAT、存储器加速器、USB2.0 主机/设备,以及多种慢速输入输出 (U客论坛)。MT7620A 支持 PCIe、RGMII,适用于 AC7…

mt7620参考设计原理图,mt7620芯片资料,mt7620处理器资料

mt7620参考设计原理图,芯片资料,处理器资料 核心资料 芯片处理器资料 设计注意事项 处理器大全 音频语音设计资料文档(U客论坛) MT7620产品系统整合了2T2R 802.11n Wi-Fi 收发器、580MHz MIPS 24KEc™ 中央处理器 (CPU)、5 端口高速以太网络端口物理层 (Ethernet PHY)、HNAT…

MT7682参考手册,MT7682芯片资料介绍

MT7682 Reference Manual 2.总线体系结构与内存映射 MediaTek MT7682采用32位多AHB矩阵,为物联网和可穿戴设备提供低功耗、快速、灵活的数据操作.表2.1-1显示了总线主机之间的互连(Cortex-M4,四个spi主站,spi从机,调试系统&#…

MT7628 openwrt学习(1)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、拿到板子之后干的事情二、openwrt编译文件下载tftp中的坑 最后是SSH和简单的编译 前言 主要是用来记录我的MT7628踩坑经历,所有东西都是开源的…

mt7621芯片更换ram

最近公司设备的内存占用率过高,经常性的导致设备挂掉,于是准备换一个ram。 解决方案: 在openwrt目录下,进入target/linux/ramips/dts目录,找到设备使用的CPU型号对应的dts文件,然后修改其中内容。将memory的…

MT7621处理器资料解析,MT7621数据表

MT7621处理器资料解析,MT7621数据表 MT7621 Wi-Fi 系统单芯片包含功能强大的 880 MHz MIPS 1004KEc™ 双核心中心处理器 (CPU)、5 端口 Gigabit 以太网络交换器,以及RGMII、PCIe、USB、SD-XC 等众多连接选项。这款全新系统单芯片亦随附我们经现场验证的硬件支持,涵盖网络地…

MT6261处理器参数介绍,MT6261芯片资料

MT6261处理器: MT6261是一种基于低功耗CMOS工艺的集成前沿电源管理单元、模拟基带和无线电电路的单片芯片。 MT6261是一种功能丰富、功能非常强大的用于高端GSM/GPRS能力的单芯片解决方案。基于32位ARM7EJ-S TM RISC处理器,MT6261的卓越处理能力TH高带…

MT8167处理器型号对比,MT8167芯片资料介绍

MT8167平台有两个版本,分别是MT8167A和MT8167B。两者之间最大的、唯一的区别在于MT8167A提供略高的处理和图形性能规格,最大的区别是支持60pps的1080p视频解码(MT8167B的30fps以上)和全高清支持(19201200) …

mt7682芯片处理器详细资料介绍

MTK MT7682S是基于一个高度集成的芯片组,包括一个微控制器单元(MCU)、一个低功耗的1x11n单波段Wi-Fi子系统和一个电源管理单元(PMU)。单片机是一个带有浮点单元的ARM Cortex-M4处理器,与1MB的闪存集成在一起。 Wi-Fi子系统包含802.11b/g/n无线电、基带和…