Android中三种计时器Timer、CountDownTimer、handler.postDelayed的使用
在android开发中,我们常常需要用到计时器,倒计时多少秒后再执行相应的功能,下面我就分别来讲讲这三种常用的计时的方法。
一、CountDownTimer
该类是个抽象类,如果要使用这个类中的方法,就必须继承这个类实现它内部的抽象方法,该继承的类中通常是存在某个类的内部类中。该类主要功能就是可以我们自己设置倒计时的秒数和时间间隔,且只有一个构造方法,构造函数为:
public CountDownTimer(long millisInFuture, long countDownInterval) {//分别为总时间和时间间隔 mMillisInFuture = millisInFuture; mCountdownInterval = countDownInterval; }
可以看出需要传入两个参数进去,第一个参数就是我们设置倒计时的总时间,第二个参数就是我们设置倒计时时的时间间隔。
我们来使用一下:
class TimeCountDown extends CountDownTimer{ public TimeCountDown(long millisInFuture, long countDownInterval) { super(millisInFuture, countDownInterval); // TODO Auto-generated constructor stub } @Override public void onTick(long millisUntilFinished) { // TODO Auto-generated method stub } @Override public void onFinish() { // TODO Auto-generated method stub } }
可以看到,子类必须要和它的构造函数参数相同之外,还必须实现它的两个方法,分别是:onTick()和onFinish()方法,
我们说说这两个方法分别是什么意思:
onTick(long millisUntilFinished):这个方法中的参数是在倒计时过程中传入进来的毫秒数,比如倒计时总时间为6秒,时间间隔为一秒,那么这个参数的传进来的值依次为:5、4、3、2、1
onFinish():这个方法就是当倒计时完毕时候触发,这时候可以设置一些配置,比如一个申请验证码的按钮,在倒计时过程中设置为失去焦点,等倒计时完毕后,就在这个方法中设置为得到焦点。
【注意】使用时也非常简单,只需要new个对象出来并传入总时间和时间间隔(单位为毫秒),这时候千万别漏了.start()方法啊,让它启动,因为作者就有次漏了,找半天发现是没写start。
下面通过部分代码来看一下整个的实现流程:
class TimeCount extends CountDownTimer { public TimeCount(long millisInFuture, long countDownInterval) { super(millisInFuture, countDownInterval);// 参数依次为总时长,和计时的时间间隔 } @Override public void onFinish() {// 计时完毕时触发 mButtonConfirmCode.setText("重新获取"); mButtonConfirmCode.setClickable(true); mButtonConfirmCode.setBackgroundColor(Color.rgb(187, 201, 230)); } @Override public void onTick(long millisUntilFinished) {// 计时过程显示 mButtonConfirmCode.setClickable(false); mButtonConfirmCode.setBackgroundColor(Color.GRAY); mButtonConfirmCode.setText("重新获取(" + millisUntilFinished / 1000 + ")秒后"); } }
使用时这么使用:
new TimeCount(60000, 1000).start();
注意要start();
二、Timer
这个类功能也是用于计时的,而且是线程安全的,创建这个类的对象也很简单,直接Timer mTimer=new Timer();new出来,也没什么可说的,而且这个对象的主要方法就一个就是schedule(),意思就是计时计划,计时安排。我就主要讲其中两个方法吧:
mTimer.schedule(task, when);这个方法第一个参数就是需要传入一个TimerTask对象,该对象实现了Runnable接口,简单的说就是一个线程对象,就是开一个线程来执行run()方法中的代码的。第二个参数传入的类型是Date类型,意思就是定时一样,这个run()方法中的代码在什么时候执行。
mTimer.schedule(task, delay);这个方法的第一个参数和上面的一样。第二个参数就是一个long类型的数据,意思就是延迟多少时间执行run()方法中的代码,单位为毫秒。
我就讲直接上代码看看怎么用吧:
Timer mTimer = new Timer(); TimerTask mTimerTask = new TimerTask() {//创建一个线程来执行run方法中的代码 @Override public void run() { //要执行的代码 } }; mTimer.schedule(mTimerTask, 3000);//延迟3秒执行
【注意】在该计时器中创建的线程不是主线程,而是创建了一个子线程,因为子线程中不能直接更新UI,故在run方法中不能执行有关更新主界面UI的代码,如果要更新UI,那必须用消息处理器Handler来处理,在run中发送一个消息给消息队列。
如果我们想既要达到计时的功能,又可以在执行的代码中直接更新主界面UI,那有没有一个好办法呢?答案是有的,就是第三点
三、new Handler().postDelayed()
该方法就是利用我们常说的消息处理器。该方法原理就是在主线程中创建一个Handler消息处理器,然后利用其中的一个postDelayed(Runnable r, long delayMillis)方法,该方法第一个参数需要传入一个Runnable接口,并实现run()方法,第二个参数就是延迟多少时间将run()方法中的代码通过一个消息发送给消息队列,然后在主线程中执行这个消息中的代码,即是run方法中的代码,从而实现在主线程中更新界面UI。
贴代码吧:
new Handler().postDelayed(new Runnable() {//在当前线程(也即主线程中)开启一个消息处理器,并在3秒后在主线程中执行,从而来更新UI @Override public void run() { //有关更新UI的代码 } }, 3000);//3秒后发送
好了,大概android中的我用到的一些计时器就为这些了,如果有其它的方法或者技术欢迎评论告知哦,谢谢啦!!!
Android中三种计时器Timer、CountDownTimer、handler.postDelayed的使用的更多相关文章
- Android中三种超实用的滑屏方式汇总(转载)
Android中三种超实用的滑屏方式汇总 现如今主流的Android应用中,都少不了左右滑动滚屏这项功能,(貌似现在好多人使用智能机都习惯性的有事没事的左右滑屏,也不知道在干什么...嘿嘿),由于 ...
- Android 中三种启用线程的方法
在多线程编程这块,我们经常要使用Handler(处理),Thread(线程)和Runnable这三个类,那么他们之间的关系你是否弄清楚了呢? 首先说明Android的CPU分配的最小单元是线程,Han ...
- Android中三种onClick事件的实现与对比
方式一:在activity的onCreate()方法中,嵌入如下代码: Button button = (Button)findViewById(R.id.button1); button.setOn ...
- (转)【移动开发】Android中三种超实用的滑屏方式汇总(ViewPager、ViewFlipper、ViewFlow)
转自: http://smallwoniu.blog.51cto.com/3911954/1308959 现如今主流的Android应用中,都少不了左右滑动滚屏这项功能,(貌似现在好多人使用智能机都习 ...
- C#中三种定时器对象的比较
·关于C#中timer类 在C#里关于定时器类就有3个1.定义在System.Windows.Forms里2.定义在System.Threading.Timer类里3.定义在System.Timers ...
- C#中三种定时器对象的比较 【转】
https://www.cnblogs.com/zxtceq/p/5667281.html C#中三种定时器对象的比较 ·关于C#中timer类 在C#里关于定时器类就有3个1.定义在System.W ...
- iOS开发UI篇—iOS开发中三种简单的动画设置
iOS开发UI篇—iOS开发中三种简单的动画设置 [在ios开发中,动画是廉价的] 一.首尾式动画 代码示例: // beginAnimations表示此后的代码要“参与到”动画中 [UIView b ...
- Android动画 三种动画
Android可以使用三种动画 Frame Animation-帧动画 ,就像GIF图片,通过一系列Drawable依次显示来模拟动画的效果 Tween Animation-补间动画,给出两个关键帧, ...
- 转-Web Service中三种发送接受协议SOAP、http get、http post
原文链接:web服务中三种发送接受协议SOAP/HTTP GET/HTTP POST 一.web服务中三种发送接受协议SOAP/HTTP GET/HTTP POST 在web服务中,有三种可供选择的发 ...
随机推荐
- bzoj 4894: 天赋
Description 小明有许多潜在的天赋,他希望学习这些天赋来变得更强.正如许多游戏中一样,小明也有n种潜在的天赋,但有 一些天赋必须是要有前置天赋才能够学习得到的.也就是说,有一些天赋必须是要在 ...
- hdu 4670 Cube number on a tree(点分治)
Cube number on a tree Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/ ...
- hdu 5052 树链剖分
Yaoge’s maximum profit Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/ ...
- 【Miller-Rabin随机判素数算法】
实用性介绍: #include<bits/stdc++.h> #define go(i,a,b) for(int i=a;i<=b;i++) #define T 5 #define ...
- BZOJ3684 大朋友和多叉树(多项式相关计算)
设$f(x)$为树的生成函数,即$x^i$的系数为根节点权值为$i$的树的个数.不难得出$f(x)=\sum_{k\in D}f(x)^k+x$我们要求这个多项式的第$n$项,由拉格朗日反演可得$[x ...
- qemu 模拟-arm-mini2440开发板-启动u-boot,kernel和nfs文件系统【转】
转自:http://www.cnblogs.com/riskyer/p/3366001.html qemu 本文介绍了如何编译u-boot.linux kernel,然后用qemu启动u-boot和l ...
- springmvc上传文件方法及注意事项
本文基于注解的配置,敬请留意 基于注解整合 一.springmvc为我们提供两种上传方式配置: org.springframework.web.multipart.commons.CommonsMu ...
- oracle安装过程和创建本地数据库
环境: win7 64位 工具: PLSQL Developer 百度云下载:链接:https://pan.baidu.com/s/14L3VCG8YwHzpdhEN7ama0w 密码:jlre or ...
- Linux学习之CentOS(八)----详解文件的搜寻、查找(转)
which (寻找『运行档』) [root@www ~]# which [-a] command 选项或参数: -a :将所有由 PATH 目录中可以找到的命令均列出,而不止第一个被找到的命令名称 分 ...
- 手写JAVA虚拟机(二)——实现java命令行
查看手写JAVA虚拟机系列可以进我的博客园主页查看. 我们知道,我们编译.java并运行.class文件时,需要一些java命令,如最简单的helloworld程序. 这里的程序最好不要加包名,因为加 ...