概述
经常要用到倒计时、定时器,但总是搞不清楚,所以这里整理一下,方便后面使用 。
一.倒计时(3、2、1)
- CountDownTimer()
//一共3秒,每隔1秒执行一次
CountDownTimer timer = new CountDownTimer(3000, 1000) {
@Override
public void onTick(long millisUntilFinished) {
//还剩下多少秒millisUntilFinished/1000,依次为2、1、0
}
@Override
public void onFinish() {//结束后的操作
}
}.start();
二.定时器
1.Timer:完整定时任务需要由Timer、TimerTask两个类来配合完成。Timer是一种定时器工具,用来在一个后台线程计划执行指定任务,而TimerTask一个抽象类,它的子类代表一个可以被Timer计划的任务。
计算下一次执行时间:当前时间(在任务执行前得到) + 时间片(实际时间)
缺陷:Timer对调度的支持是绝对时间,不会捕获异常,当TimerTask抛出异常导致Timer线程终止,Timer不会恢复,把整个线程取消。内部是单一线程
- 公共的
//当前时间往后1分钟,eg:现在11:11:11,那么得到的是11:12:11(举例的是时分秒)
long currentTime = System.currentTimeMillis() + 1 * 60 * 1000;
Date date = new Date(currentTime);
Timer timer=new Timer();
timer.cancel();//取消定时器
- 指定时间执行一次(当前时间1分钟后执行一次)
timer.schedule(new TimerTask() { @Override public void run() { //要做的事情M } },date);
-
延时执行一次(1秒后执行一次)
timer.schedule(new TimerTask() { @Override public void run() { //要做的事情M } },1000);
-
指定时间开始执行,执行完后等2秒再进行下一次,以此类推一直循环
timer.schedule(new TimerTask() { @Override public void run() { //要做的事情M } },date,2000);
-
延时1秒后开始执行,执行完后等2秒再进行下一次,以此类推一直循环
timer.schedule(new TimerTask() { @Override public void run() { //要做的事情M } },1000,2000);
2.ScheduledExecutorService(推荐使用):是将定时任务与线程池功能结合在了一起,任务是并发执行,互不影响
计算下一次执行的时间:当前需要执行的时间(也就是计算出现在应该执行的时间)+ 时间片
优点:ScheduledExecutorService对调度的支持是相对时间(前一个执行结束后相隔多少秒再执行下一个),内部是个线程池
- 公共的
ScheduledExecutorService service= Executors.newScheduledThreadPool(10);//线程池数 service.shutdown();//取消定时器
- schedule延时执行一次
service.schedule(new Runnable() { @Override public void run() { //要做的事情M } },1, TimeUnit.SECONDS);//TimeUnit.SECONDS是秒,合起来就是1秒后执行一次
- scheduleAtFixedRate(一秒后开始执行,之后每隔period秒执行一次) 参数period:两次开始执行时间
service.scheduleAtFixedRate(new Runnable() { @Override public void run() { //要做的事情M } },1,2, TimeUnit.SECONDS);
- scheduleWithFixedDelay(一秒后开始执行,之后每隔delay秒执行一次) 参数delay:前一次执行结束到下一次执行开始的间隔时间
service.scheduleWithFixedDelay(new Runnable() { @Override public void run() { //要做的事情M } },1,2, TimeUnit.SECONDS);
三.定时执行次数(eg:每隔1秒执行一次共3次)
private int count = 0;
private Handler handler = new android.os.Handler();
Runnable runnable = new Runnable() {
@Override
public void run() {
//要做的事情 M
…………………………………………
//为什么是>=2,因为count为0时执行一次M,1时执行一次M,2时执行一次M,然后移除,不再执行(共执行3次M)
if (count >= 2) {
handler.removeCallbacks(this);//删除指定Runnable ,停止运行
} else {
handler.postDelayed(this, 1000);//一秒后执行
count++;
}
}
};
handler.post(runnable);//启动定时器
最后
以上就是暴躁河马为你收集整理的Android:倒计时、定时器、定时执行次数使用笔记的全部内容,希望文章能够帮你解决Android:倒计时、定时器、定时执行次数使用笔记所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复