本文实例为大家分享了Android计时器的三种方法,具体内容如下

目录:

1、借助Timer实现

2、调用handler.sendMessagedely(Message msg, long delayMillis)

3、借助布局Chronometer

1、借助Timer实现

(1) 布局文件

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical" >

android:id="@+id/timerView"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_gravity="center_horizontal"

android:textSize="60sp" />

布局文件很简单,就是一个TextView用来显示计时时间。下面看一下Activity里的逻辑实现:

(2)Activity文件

public class MyChronometer extends Activity {

private TextView timerView;

private long baseTimer;

@Override

protected void onCreate(Bundle savedInstanceState) {

setContentView(R.layout.chrono);

MyChronometer.this.baseTimer = SystemClock.elapsedRealtime();

timerView = (TextView) this.findViewById(R.id.timerView);

final Handler startTimehandler = new Handler(){

public void handleMessage(android.os.Message msg) {

if (null != timerView) {

timerView.setText((String) msg.obj);

}

}

};

new Timer("开机计时器").scheduleAtFixedRate(new TimerTask() {

@Override

public void run() {

int time = (int)((SystemClock.elapsedRealtime() - MyChronometer.this.baseTimer) / 1000);

String hh = new DecimalFormat("00").format(time / 3600);

String mm = new DecimalFormat("00").format(time % 3600 / 60);

String ss = new DecimalFormat("00").format(time % 60);

String timeFormat = new String(hh + ":" + mm + ":" + ss);

Message msg = new Message();

msg.obj = timeFormat;

startTimehandler.sendMessage(msg);

}

}, 0, 1000L);

super.onCreate(savedInstanceState);

}

新开一个定时器(Timer), 在子线程中获取开机时间并转成字符串格式, 利用handler传回UI线程显示。

(3)运行结果:

2.调用handler.sendMessagedely(Message msg, long delayMillis)

(1) 布局文件与方法1 相同,运行结果与方法1 相同

(2)Activity文件

public class MyChronometer extends Activity {

private TextView timerView;

private long baseTimer;

@Override

protected void onCreate(Bundle savedInstanceState) {

setContentView(R.layout.chrono);

MyChronometer.this.baseTimer = SystemClock.elapsedRealtime();

timerView = (TextView) this.findViewById(R.id.timerView);

Handler myhandler = new Handler(){

public void handleMessage(android.os.Message msg) {

if (0 == MyChronometer.this.baseTimer) {

MyChronometer.this.baseTimer = SystemClock.elapsedRealtime();

}

int time = (int)((SystemClock.elapsedRealtime() - MyChronometer.this.baseTimer) / 1000);

String hh = new DecimalFormat("00").format(time / 3600);

String mm = new DecimalFormat("00").format(time % 3600 / 60);

String ss = new DecimalFormat("00").format(time % 60);

if (null != MyChronometer.this.timerView) {

timerView.setText(hh + ":" + mm + ":" + ss);

}

sendMessageDelayed(Message.obtain(this, 0x0), 1000);

}

};

myhandler.sendMessageDelayed(Message.obtain(myhandler, 0x0), 1000);

super.onCreate(savedInstanceState);

}

sendMessageDelayed (Message msg, long delayMillis):在 delayMillis/1000 秒后发送消息 msg。

在Handler 的 handleMessage()方法中调用sendMessageDelayed方法, 巧妙的实现了循环。需要注意的是,在Handler外要调用一次startTimehandler.sendMessageDelayed(Message.obtain(startTimehandler, 0x0), 1000);  以作为循环的入口。

3.借助布局Chronometer

(1) 布局文件

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical" >

android:id="@+id/chronometer"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_gravity="center_horizontal"

android:textSize="60sp" />

布局Chronometer继承自TextView

(2)Activity文件

public class MyChronometer extends Activity {

Chronometer chronometer;

@Override

protected void onCreate(Bundle savedInstanceState) {

setContentView(R.layout.chrono);

chronometer = (Chronometer) this.findViewById(R.id.chronometer);

chronometer.setBase(SystemClock.elapsedRealtime());

chronometer.start();

super.onCreate(savedInstanceState);

}

}

逻辑代码很简单,调用chronometer.start()就可以开始计时。

chronometer.setBase(long base):设置起始计时点,这里设置的是获取开机时间。

chronometer.start():以上面setBase()设置的时间点为起始点,开始计时,看一下start()的源码就知道了:

public void start() {

mStarted = true;

updateRunning();

}

调用了updateRunning(), 跟入updateRunning()方法:

private void updateRunning() {

boolean running = mVisible && mStarted;

if (running != mRunning) {

if (running) {

updateText(SystemClock.elapsedRealtime());

dispatchChronometerTick();

mHandler.sendMessageDelayed(Message.obtain(mHandler, TICK_WHAT), 1000);

} else {

mHandler.removeMessages(TICK_WHAT);

}

mRunning = running;

}

}

private Handler mHandler = new Handler() {

public void handleMessage(Message m) {

if (mRunning) {

updateText(SystemClock.elapsedRealtime());

dispatchChronometerTick();

sendMessageDelayed(Message.obtain(this, TICK_WHAT), 1000);

}

}

};

用updateText()方法设置时间显示。 至于计时循环机制,和方法二相同,同样是调用了handler的handMessageDelayed方法。

(3)运行结果:

注意:最后说一个关于Chronometer类的常见问题,看到很多人都问用Chronometer类如何设置格式HH:MM:SS的时间。(如果您有此问题请继续看,没有问题请忽略)

问这个问题的童鞋先看一下官方文档的描述:

If the format string is null, or if you never call setFormat(), the Chronometer will simply display the timer value in "MM:SS" or "H:MM:SS" form.

也就是说默认情况下,使用的格式是"MM:SS" 或者 "H:MM:SS", 然后有童鞋又会问:那到底是"MM:SS" 还是 "H:MM:SS"。我们先看一下源码:

updateText():

private synchronized void updateText(long now) {

long seconds = now - mBase;

seconds /= 1000;

String text = DateUtils.formatElapsedTime(mRecycle, seconds);

if (mFormat != null) {

Locale loc = Locale.getDefault();

if (mFormatter == null || !loc.equals(mFormatterLocale)) {

mFormatterLocale = loc;

mFormatter = new Formatter(mFormatBuilder, loc);

}

mFormatBuilder.setLength(0);

mFormatterArgs[0] = text;

try {

mFormatter.format(mFormat, mFormatterArgs);

text = mFormatBuilder.toString();

} catch (IllegalFormatException ex) {

if (!mLogged) {

Log.w(TAG, "Illegal format string: " + mFormat);

mLogged = true;

}

}

}

setText(text);

}

调用了DateUtils.formatElapsedTime, 看一下DateUtils.formatElapsedTime里面都有啥:

public static String formatElapsedTime(StringBuilder recycle, long elapsedSeconds) {

Formatter f = new Formatter(sb, Locale.getDefault());

initFormatStrings();

if (hours > 0) {

return f.format(sElapsedFormatHMMSS, hours, minutes, seconds).toString();

} else {

return f.format(sElapsedFormatMMSS, minutes, seconds).toString();

}

}

代码较多,我就挑重点截取了,仔细看看上面哪个if(){}else{}语句,你肯定就恍然大悟了吧?

为了我们理论的正确性,将方法三 Activity中的代码稍作修改:

chronometer.setBase(-18000000);

运行结果如下:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

android简单计时器源码,Android计时器的三种实现方式(Chronometer、Timer、handler)...相关推荐

  1. android简单记账源码,Android+个人记账程序源码.rar(入门级)

    [实例简介]Android 个人记账程序源码,入门级源码,适合新手... [实例截图] [核心代码] package com.cola.ui; import java.util.Calendar; i ...

  2. android 滑动接听源码,android仿摩拜单车APP、炫酷RecyclerView、卡片滑动、仿饿了么点餐、自定义索引等源码...

    Android精选源码 Android优质博客 前言permissions4m 最初的设计是仅仅做成一个编译器注解框架,在1.0.0版本时,它纯粹地实现了原生 Android 请求流程,关于它的设计思 ...

  3. android studio im源码,Android Studio 导入 AOSP 源码

    有了 AOSP 源码,接下来就是如何看了,可以直接文本看,可以用 Source Insight,我当然选择 Android Studio,Android Studio 是我熟悉且十分强大的工具.问题来 ...

  4. android简单计时器源码,Android 实现一个计时器

    [实例简介] Android实现一个计时器.功能:计时,可以暂停计时.主要利用handler的postdelay()函数. [实例截图] [核心代码] calTimer └── calTimer ├─ ...

  5. android 图片查看源码,Android 简单的图片查看器源码

    public class MainActivity extends Activity { private EditText et_path; private ImageView iv; //创建han ...

  6. android 自定义相机源码,Android 自定义相机及分析源码

    Android 自定义相机及分析源码 使用Android 系统相机的方法: 要想让应用有相机的action,咱们就必须在清单文件中做一些声明,好让系统知道,如下 action的作用就是声明action ...

  7. android 九宫格解锁源码,Android 自己动手实现滑动九宫格解锁

    Android 自己动手实现滑动九宫格解锁 文章主要以实现思路为主.来带领大家逐步实现该效果功能.如有问题,请多多提出 效果预览 整体思路分析 九宫格滑动解锁,为当下比较热门的手机,Pad等触屏设备很 ...

  8. android 手机壁纸源码,Android设置手机壁纸-源码(WallPaper)

    Android设置手机壁纸-源码(WallPaper) /** * Andorid设置手机屏幕的壁纸 * * @description: * @author ldm * @date 2016-5-4 ...

  9. android 夜间模式源码,Android Support Library 之 夜间模式

    前言 夜间模式实现方式:1.通过切换theme来实现夜间模式.优点:可以匹配多套主题,并不局限于黑白模式缺点:需要大量定义主题详见博客:http://wuxiaolong.me/2015/08/19/ ...

  10. android手势密码源码,Android自定义UI手势密码改进版源码下载

    在之前文章的铺垫下,再为大家分享一篇:Android手势密码,附源码下载,不要错过. 先看第一张图片的布局文件 activity_main.xml xmlns:tools="http://s ...

最新文章

  1. Android错误之--activity_main cannot be resolved or is not a field
  2. Jest 测试框架 beforeEach 的设计原理解析
  3. S/4HANA Extension field的UI visible checkbox逻辑
  4. poj1050最大子矩阵和
  5. JavaScript基础学习(二)—JavaScript基本概念
  6. 斯坦福机器学习教程学习笔记之1
  7. linux 消息队列最大值,linux 消息队列的限制
  8. 这8行代码的惊艳与反思
  9. 嵌入式监控【v4l2采集-vpu编码-live555推流】
  10. 安卓修改包名和Project
  11. 铁匠smith_铁匠的大气散射
  12. 互联网公司招聘--奇虎360--研发工程师--2016年笔试题
  13. VVC/VTM 4.2 帧内编码——亮度预测理解
  14. Android设置屏幕保持长亮
  15. 如何react中使用redux和react-redux
  16. Python课程作品设计——基于EXCEL的批量重命名工具
  17. 微盛企微管家与企鲸客scrm的功能差别
  18. Android5.0以上通知栏图标设计
  19. java实现 手写体识别_java手写体英文数字识别系统 识别预处理如何实现 采用什么语言比较好...
  20. python实践-轩宇阅读网爬取全部小说

热门文章

  1. python 压缩 解压文件
  2. 计算机网络入侵参考文献,入侵计算机网络论文,关于计算机网络入侵检测相关参考文献资料-免费论文范文...
  3. win10系统打不开qq提示错误代码0x00000005怎么办
  4. OpenGL 编程指南 ( 原书第 9 版 ) --- 第二章
  5. 土豆网电影在线观看客户端官方版
  6. 【从零开始学习Go语言】一.初识Go语言
  7. 三相全桥整流电路_什么是三相全波整流电路,三相全波整流电路的工作原理是什么,三相全波整流电路电路图...
  8. Mac 技巧|忘记了开机密码的解决办法
  9. Mac BookPro 开机密码忘记解决办法
  10. mac忘记mysql初始密码怎么办_Mac下忘记Mysql密码重新设置密码的图文教程