CountDownTimer的用法及原理
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的用法及原理的更多相关文章
- imadjust从用法到原理—Matlab灰度变换函数之一
imadjust从用法到原理-Matlab灰度变换函数之一 转摘网址:http://blog.sina.com.cn/s/blog_14d1511ee0102ww6s.html imadjust函数是 ...
- Python 中 -m 的典型用法、原理解析与发展演变
在命令行中使用 Python 时,它可以接收大约 20 个选项(option),语法格式如下: python [-bBdEhiIOqsSuvVWx?] [-c command | -m module- ...
- synchronized是什么,用法及原理
文章转Hollis博客 大家可以关注下,很多技术类型的文章 在再有人问你Java内存模型是什么,就把这篇文章发给他.中我们曾经介绍过,Java语言为了解决并发编程中存在的原子性.可见性和有序性问题,提 ...
- Java之反射 — 用法及原理
Java之反射 - 用法及原理 定义 Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象 ...
- java this的用法以及原理
/** * this存在方法中,在方法中被调用. * 且是非static方法中被调用.(this 表示这个类的当前实例,而静态方法不依赖于该类的任何实例,随着类产生而装载,因此方法内不能引用 this ...
- webpack基本用法及原理(10000+)
1 webpack是什么 所有工具的出现,都是为了解决特定的问题,那么前端熟悉的webpack是为了解决什么问题呢? 1.1 为什么会出现webpack js模块化: 浏览器认识的语言是HTML,CS ...
- ASP.NET Core MVC 模型绑定用法及原理
前言 查询了一下关于 MVC 中的模型绑定,大部分都是关于如何使用的,以及模型绑定过程中的一些用法和概念,很少有关于模型绑定的内部机制实现的文章,本文就来讲解一下在 ASP.NET Core MVC ...
- Linux常用性能工具功能、用法及原理(一)
Linux性能观测工具按类别可分为系统级别和进程级别,系统级别对整个系统的性能做统计,而进程级别则具体到进程,为每个进程维护统计信息. 按实现原理分,可分为基于计数器和跟踪以及剖析.含义如下: 计数器 ...
- Spark SQL入门用法与原理分析
Spark SQL是为了让开发人员摆脱自己编写RDD等原生Spark代码而产生的,开发人员只需要写一句SQL语句或者调用API,就能生成(翻译成)对应的SparkJob代码并去执行,开发变得更简洁 注 ...
随机推荐
- Hangfire JobStorage.Current property value has not been initialized
app.UseHangfireServer() 放到 app.UseAbp() 前面 作者: zhaok 出处: http://dotnetmonkey.cnblogs.com/
- vSphere虚拟主机安装Centos7系统
经过上一帖的主机设置,这一步就可以开始安装系统了,本次详细记录各个过程并分析结果. Centos7 1.右键点击列表中的虚拟主机,打开控制台. 点击绿色开机键,开始安装. 这里有一个很关键的点,就是上 ...
- Linux系统编程:socket网络编程(操作篇)
一.问题思考 问1.网络通信应用在什么场合?通信的前提是什么? 答1.主要应用在不同主机进程间的互相通信,同一主机的进程也可以使用网络进行通信.通信的前提是如何标识通信进程的唯一,由于不同主机的进程极 ...
- deepin安装php5.6
sudo su -echo "deb http://ppa.launchpad.net/ondrej/php/ubuntu xenial main" | tee -a /etc/a ...
- Linux下Tomcat8.0.44配置使用Apr
听说Apr可以提高tomcat很多的性能,配置具体如下 1.安装apr 1.5.2 [root@ecs-3c46 ]# cd /usr/local/src [root@ecs-3c46 src]# w ...
- unity代码创建草和模拟风的效果
void Start() { Test4(); } //草 private Vector3[] grassArray = new Vector3[7]; private GameObject gras ...
- WPF的Label默认的padding不为0
1.如图: 要求让“Tools” 左对齐,代码中已设置:HorizontalContentAlignment="Left" <Label Foreground="W ...
- throws 与 throw
摘录自:http://blog.csdn.net/ronawilliam/article/details/3299676 void doA() throws Exception1, Exception ...
- ASP.NET MVC* 采用Unity依赖注入Controller
Unity是微软Patterns & Practices团队所开发的一个轻量级的,并且可扩展的依赖注入(Dependency Injection)容器,它支持常用的三种依赖注入方式:构造器注入 ...
- Angular2-路由重定向的办法
使用Angular2开发,常会遇到路由重定向的应用场景. 路由重定向的配置办法是这样的: {path:'要定向的路径', redirectTo:'要定向到的目标路由'} 比如某组件有个路由插件,并且一 ...