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. rbac - 介绍

    找到了上学期末压箱底的rbac组件,这里总结下. 介绍: rbac组件:一个基于角色的权限访问控制系统的组件. 目录:

  2. 关于ubuntu环境下gcc使用的几点说明

    sudo apt-get build-dep gcc //安装gcc编译器 /* 假设已经创建hello.c文件 */ //方法一 $gcc hello.c //将源文件直接编译成文件名为a.out的 ...

  3. IC79620: USER'S ROUTINE MAY BE TERMINATED ABNORMALLY IF SOME SYSTEMROUTINES WERE RUN IN DB2FMP BEFORE

    http://www-01.ibm.com/support/docview.wss?uid=swg1IC79620 APAR status Closed as program error. Error ...

  4. Django中管理并发操作

    上一篇我们说了,如何在Django中进行事务操作,数据的原子性操作 涉及了事务操作,我们不得不考虑的另一个问题就是:并发操作 还是那个用户转账的操作 我们使用事务操作解决的操作中途服务器宕机问题 但是 ...

  5. 通过System获取java环境变量的路径

    通过System获取java环境变量的路径代码为: import java.io.FileNotFoundException; import java.io.FileOutputStream; imp ...

  6. jmeter笔记

    Jmeter性能测试 入门 Jmeter 录制脚本:使用一个叫badbody的工具录制脚步供jmeter使用,http://www.badboy.com.au/:也可以用jmeter来录制 Jmete ...

  7. 编译原理LL(1)文法

    从左向右扫描输入,然后产生最左推导(就是每次都把最左边的非终结字符用产生式代替). (一)First集合 比如有产生式 A-> + T | - P , 当我们读到串为 +开头的时候,我们可以很直 ...

  8. JavaScript数据结构-1.数组

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. transition过渡效果

    语法:transition: property duration timing-function delay; transition-property 规定设置过渡效果的 CSS 属性的名称.tran ...

  10. struts2 servlet之间通信

    Servlet之间通信的方式有两大类,每个类有三种不同的方法 1.request 2.session 3.application 不实现ServletContextAware,SessionAware ...