1.主线程中使用

值得注意的是,CountDownTimer可以在主线程中直接使用。验证一下回调的执行线程。在主线程中执行如下代码

CountDownTimer countDownTimer = new CountDownTimer(1000L * , 1000L) {
@Override
public void onTick(long millisUntilFinished) {
// your logic for tick
Log.i("TEST", "onTick - " + Thread.currentThread() + ", id - " + Thread.currentThread().getId());
} @Override
public void onFinish() {
// your logic for finish Log.i("TEST", "onFinish" + Thread.currentThread() + ", id - " + Thread.currentThread().getId());
}
};
countDownTimer.start();

Log:

- ::13.545   I TEST    : onTick - Thread[main,,main], id -
- ::14.546 I TEST : onTick - Thread[main,,main], id -
- ::15.548 I TEST : onTick - Thread[main,,main], id -
- ::16.550 I TEST : onTick - Thread[main,,main], id -
- ::17.551 I TEST : onTick - Thread[main,,main], id -
- ::18.553 I TEST : onTick - Thread[main,,main], id -
- ::19.555 I TEST : onTick - Thread[main,,main], id -
- ::20.557 I TEST : onTick - Thread[main,,main], id -
- ::21.560 I TEST : onTick - Thread[main,,main], id -
- ::22.563 I TEST : onTick - Thread[main,,main], id -
- ::23.566 I TEST : onTick - Thread[main,,main], id -
- ::24.569 I TEST : onTick - Thread[main,,main], id -
- ::25.571 I TEST : onTick - Thread[main,,main], id -
- ::26.573 I TEST : onTick - Thread[main,,main], id -
- ::27.575 I TEST : onTick - Thread[main,,main], id -
- ::28.578 I TEST : onTick - Thread[main,,main], id -
- ::29.580 I TEST : onTick - Thread[main,,main], id -
- ::30.581 I TEST : onTick - Thread[main,,main], id -
- ::31.583 I TEST : onTick - Thread[main,,main], id -
- ::32.586 I TEST : onTick - Thread[main,,main], id -
- ::33.588 I TEST : onTick - Thread[main,,main], id -
- ::34.589 I TEST : onTick - Thread[main,,main], id -
- ::35.592 I TEST : onTick - Thread[main,,main], id -
- ::36.595 I TEST : onTick - Thread[main,,main], id -
- ::37.598 I TEST : onTick - Thread[main,,main], id -
- ::38.599 I TEST : onTick - Thread[main,,main], id -
- ::39.601 I TEST : onTick - Thread[main,,main], id -
- ::40.602 I TEST : onTick - Thread[main,,main], id -
- ::41.604 I TEST : onTick - Thread[main,,main], id -
- ::43.546 I TEST : onFinishThread[main,,main], id -

可见,回调执行在主线程,这也就意味着可以在回调中直接处理UI,还是很方便的。

2.在工作线程中使用

不能在工作线程中像主线程一样简单使用的原因,是CountDownTimer是基于Handler的,细节将在原理部分说明。主线程已经由安卓框架层启动了消息循环,所以可以直接使用。那么在工作线程中怎样使用呢?可以借助于HanderThread。在onLooperPrepared()中初始化并开启CountDownTimer:

new HandlerThread("TestThread") {
protected void onLooperPrepared() {
CountDownTimer countDownTimer = new CountDownTimer(1000L * , 1000L) {
@Override
public void onTick(long millisUntilFinished) {
// your logic for tick
Log.i("TEST", "onTick - " + Thread.currentThread() + ", id - " + Thread.currentThread().getId());
} @Override
public void onFinish() {
// your logic for finish
Log.i("TEST", "onFinish" + Thread.currentThread() + ", id - " + Thread.currentThread().getId());
}
};
countDownTimer.start();
}
}.start();

执行log如下:

- ::35.789   I TEST    : onTick - Thread[TestThread,,main], id -
- ::36.790 I TEST : onTick - Thread[TestThread,,main], id -
- ::37.793 I TEST : onTick - Thread[TestThread,,main], id -
- ::38.795 I TEST : onTick - Thread[TestThread,,main], id -
- ::39.797 I TEST : onTick - Thread[TestThread,,main], id -
- ::40.800 I TEST : onTick - Thread[TestThread,,main], id -
- ::41.801 I TEST : onTick - Thread[TestThread,,main], id -
- ::42.803 I TEST : onTick - Thread[TestThread,,main], id -
- ::43.804 I TEST : onTick - Thread[TestThread,,main], id -
- ::44.806 I TEST : onTick - Thread[TestThread,,main], id -
- ::45.809 I TEST : onTick - Thread[TestThread,,main], id -
- ::46.810 I TEST : onTick - Thread[TestThread,,main], id -
- ::47.813 I TEST : onTick - Thread[TestThread,,main], id -
- ::48.814 I TEST : onTick - Thread[TestThread,,main], id -
- ::49.816 I TEST : onTick - Thread[TestThread,,main], id -
- ::50.818 I TEST : onTick - Thread[TestThread,,main], id -
- ::51.820 I TEST : onTick - Thread[TestThread,,main], id -
- ::52.821 I TEST : onTick - Thread[TestThread,,main], id -
- ::53.823 I TEST : onTick - Thread[TestThread,,main], id -
- ::54.825 I TEST : onTick - Thread[TestThread,,main], id -
- ::55.827 I TEST : onTick - Thread[TestThread,,main], id -
- ::56.828 I TEST : onTick - Thread[TestThread,,main], id -
- ::57.829 I TEST : onTick - Thread[TestThread,,main], id -
- ::58.831 I TEST : onTick - Thread[TestThread,,main], id -
- ::59.832 I TEST : onTick - Thread[TestThread,,main], id -
- ::00.835 I TEST : onTick - Thread[TestThread,,main], id -
- ::01.836 I TEST : onTick - Thread[TestThread,,main], id -
- ::02.838 I TEST : onTick - Thread[TestThread,,main], id -
- ::03.840 I TEST : onTick - Thread[TestThread,,main], id -
- ::05.791 I TEST : onFinishThread[TestThread,,main], id -

CountDownTimer的用法及原理的更多相关文章

  1. imadjust从用法到原理—Matlab灰度变换函数之一

    imadjust从用法到原理-Matlab灰度变换函数之一 转摘网址:http://blog.sina.com.cn/s/blog_14d1511ee0102ww6s.html imadjust函数是 ...

  2. Python 中 -m 的典型用法、原理解析与发展演变

    在命令行中使用 Python 时,它可以接收大约 20 个选项(option),语法格式如下: python [-bBdEhiIOqsSuvVWx?] [-c command | -m module- ...

  3. synchronized是什么,用法及原理

    文章转Hollis博客 大家可以关注下,很多技术类型的文章 在再有人问你Java内存模型是什么,就把这篇文章发给他.中我们曾经介绍过,Java语言为了解决并发编程中存在的原子性.可见性和有序性问题,提 ...

  4. Java之反射 — 用法及原理

    Java之反射 - 用法及原理 定义 Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象 ...

  5. java this的用法以及原理

    /** * this存在方法中,在方法中被调用. * 且是非static方法中被调用.(this 表示这个类的当前实例,而静态方法不依赖于该类的任何实例,随着类产生而装载,因此方法内不能引用 this ...

  6. webpack基本用法及原理(10000+)

    1 webpack是什么 所有工具的出现,都是为了解决特定的问题,那么前端熟悉的webpack是为了解决什么问题呢? 1.1 为什么会出现webpack js模块化: 浏览器认识的语言是HTML,CS ...

  7. ASP.NET Core MVC 模型绑定用法及原理

    前言 查询了一下关于 MVC 中的模型绑定,大部分都是关于如何使用的,以及模型绑定过程中的一些用法和概念,很少有关于模型绑定的内部机制实现的文章,本文就来讲解一下在 ASP.NET Core MVC ...

  8. Linux常用性能工具功能、用法及原理(一)

    Linux性能观测工具按类别可分为系统级别和进程级别,系统级别对整个系统的性能做统计,而进程级别则具体到进程,为每个进程维护统计信息. 按实现原理分,可分为基于计数器和跟踪以及剖析.含义如下: 计数器 ...

  9. Spark SQL入门用法与原理分析

    Spark SQL是为了让开发人员摆脱自己编写RDD等原生Spark代码而产生的,开发人员只需要写一句SQL语句或者调用API,就能生成(翻译成)对应的SparkJob代码并去执行,开发变得更简洁 注 ...

随机推荐

  1. FileRecv VNCViewer 使用方法

    版本 区别 一路点点点 . 就ok了 看到这个页面 点击   vnc viewer 输入 老师 会告诉你 IP地址  点击 就ok

  2. matplotlib画图无法显示图例 报错No handles with labels found to put in legend.

    很久没有matplotlib了,今天画图的时候发现了一个很小的问题....明明加了legend(),图表会出来,却无法正常显示图例.最后发现只要在plt.plot()加label图例就可以正常显示了.

  3. Mac下截图工具

    苹果系统自带截图功能 1.截取全屏:快捷键(Shift+Command+3) ▲直接按“Shift+Command+3“快捷键组合,即可截取电脑全屏,图片自动保存在桌面. 2.截图窗口:快捷键(Shi ...

  4. 连接Git@OSC操作步骤

    一.准备工作 软件下载 Git:地址 TortoiseGit:地址 二.安装与配置 1.Git安装 Git配置 设置客户端的用户名和email 然后,到Git@OSC 上面注册一个帐号. 这个帐号就是 ...

  5. JS框架设计之命名空间设计一种子模块

    命名空间 1.种子模块作为一个框架的最开始,除了负责初始化框架的最基础部分. 2.种子模块作为框架的最开始,那么什么是种子框架的最开始呢?答案是IIFE(立即调用函数表达式); IIFE(立即调用函数 ...

  6. Springboot用官方建议访问Html页面并接传值

    Springboot用官方建议访问Html页面并接传值 我们以前通常习惯用webapp来防止jsp页面,但是到了Springboot中,官方建议用Static文件夹来存放及静态的资源, 用templa ...

  7. Logback 学习笔记

    来源:http://webinglin.github.io/2015/06/04/Logback-%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/ Logback背景 Log ...

  8. 创建第一个WCF服务

    创建WCF服务 1. 新建立空白解决方案,并在解决方案中新建项目,项目类型为:WCF服务应用程序. 2.建立完成后如下图所示: 3.删除系统生成的两个文件IService1.cs与Service1.s ...

  9. A GDB Tutorial with Examples--转

    http://www.cprogramming.com/gdb.html A GDB Tutorial with Examples By Manasij Mukherjee A good debugg ...

  10. docker 常见操作

    docker rm $(docker ps -a -q --filter status=exited)   // 删除不在运行的 镜像