Android计时器和倒计时

  1. 两个核心类 Timer 和 TimerTask

1) Timer核心方法

Java代码

  1. //Schedules the specified task for execution after the specified delay.
  2. void schedule(TimerTask task, long delay)
  3. //Schedules the specified task for repeated fixed-delay execution, beginning after the specified delay.
  4. void schedule(TimerTask task, long delay, long period)

第一个方法只执行一次;

第二个方式每隔period执行一次,delay表示每次执行的延时时间,其实主要表现在第一次的延时效果,比如delay设置为0,那么立马执行task内容,如果设置为1000,那么第一次执行task会有一秒的延时效果。

2) TimerTask用于继承(或者直接定义并初始化匿名类),并重写run方法,定义自己的业务逻辑。

3) 手动结束定时器,

Timer和TimerTask都有cancel方法,而且最好同时调用;

如果已经cancel,下次必须创建新的Timer才能schedule。

4) 如果你在当前的activity中schedule了一个task,但是没有等到task结束,就按Back键finish了当前的activity,Timer和TimerTask并不会自动cancel或者销毁,它还会在后台运行,此时如果你在task的某个阶段要调起一个控件(比如AlertDialog),而该控制依赖被销毁的activity,那么将会引发crash。

5) 例如对进度条实现每一秒递增的效果(主要代码)

Java代码  

  1. //总时长
  2. private static final long TOTAL_QUERY_MINUTES = 50;
  3. //比如每5秒去查询数据库
  4. private static final long QUERY_INTERVAL = 5 *1000;
  5. private static final int TIMER_SCHEDULE_CODE = 1;
  6. int timePassed=0;
  7. QueryTimerTask queryTask;
  8. private Timer timer;
  9. //显示定时器的效果
  10. ProgressBar statusBar;
  11. private Handler mHandler= new Handler(new Handler.Callback() {
  12. @Override
  13. public boolean handleMessage(Message msg) {
  14. switch (msg.what) {
  15. case TIMER_SCHEDULE_CODE:
  16. statusBar.setProgress(timePassed);
  17. //Log.w(TAG, "timePassed : " + timePassed + " -- TOTAL_QUERY_MINUTES : " + TOTAL_QUERY_MINUTES);
  18. if (timePassed>=TOTAL_QUERY_MINUTES){
  19. if (timer != null)
  20. timer.cancel();
  21. if (queryTask != null)
  22. queryTask.cancel();
  23. new AlertDialog.Builder(YourActivity.this).
  24. setTitle("超时通知").setMessage("已超时,是否继续等待?")
  25. .setPositiveButton("继续等待", new DialogInterface.OnClickListener() {
  26. public void onClick(DialogInterface dialog, int which) {
  27. reSchedule();
  28. }
  29. })
  30. .setNegativeButton("取消任务", new DialogInterface.OnClickListener() {
  31. public void onClick(DialogInterface dialog, int which) {
  32. //cancelTask();
  33. }
  34. }).show();
  35. break;
  36. //....
  37. }
  38. return true;
  39. }
  40. });
  41. void reSchedule() {
  42. timePassed = 0;
  43. if (timer != null) {
  44. timer.cancel();
  45. }
  46. if (queryTask != null) {
  47. queryTask.cancel();
  48. }
  49. timer = new Timer();
  50. queryTask = new QueryTimerTask();
  51. //每一秒执行一次,第一次有延时一秒的效果
  52. timer.schedule(queryTask, 1000, 1000);
  53. }
  54. //自定义task
  55. class QueryTimerTask extends TimerTask {
  56. @Override
  57. public void run() {
  58. //比如每过QUERY_INTERVAL去查询信息
  59. if ((timePassed * 1000) % QUERY_INTERVAL == 0) {
  60. //query();
  61. }
  62. timePassed++;
  63. //通知handler去改变statusBar
  64. Message message = mHandler.obtainMessage();
  65. message.what = TIMER_SCHEDULE_CODE;
  66. mHandler.sendMessage(message);
  67. }
  68. }

2. 倒计时

其实也可以用上面的方法实现,

安卓额外提供了CountdownTimer类,以后再补充

文章来源:http://itlanbao.com/preview.aspx#1,0

时间: 2024-12-28 16:40:15

Android计时器和倒计时的相关文章

android 计时器,倒计时

自己定义CountDownTimer /** * 计时器 * @author Administrator * */ class TimeCount extends CountDownTimer{ public TimeCount(long millisInFuture, long countDownInterval) { super(millisInFuture, countDownInterval); } @Override public void onFinish() { } @Overri

Android计时器TimerTask,Timer,Handler

Android计时器TimerTask,Timer,若要在TimerTask中更新主线程UI,鉴于Android编程模型不允许在非主线程中更新主线程UI,因此需要结合Android的Handler实现在Java的TimerTask中更新主线程UI. 现给出一个简单示例.代码使用标准Java的TimerTask和Timer启动一个计时器Task.该任务每隔2秒更新主线程的UI(在主线程的TextView显示最新的系统时间:System.currentTimeMillis()). package z

【Android】验证码倒计时(Service完成,页面切换不中断)

[Android]验证码倒计时(Service完成,页面切换不中断) Service+CountDownTimer+Handler完成倒计时功能,页面切换不中断. 下载地址:http://www.devstore.cn/code/info/598.html

Chronometer控件实现的Android计时器

本文为大家演示了如何使用Chronometer控件实现Android计时器的实例. 先贴上最终的实现效果图: Android计时器实现思路 使用Chronometer控件实现计器的操作.通过设置setBase(long base)来设置初始时间,然后为其添加一个 setOnChronometerTickListener(Chronometer.OnChronometerTickListener l)事件来判断时间是否到了,然后再调用其stop()方法实现停止计时. Android计时器实现代码

Java/Android计时器(开始,暂停,恢复,停止)

由于要做暂停和恢复,这里我就没有使用Android的CountDownTimer,而是用了Java的Timer.所以,这个方法在java肯定是通用.我也外加了Android独有的Service,有些计时器需要在Activiy关闭的情况下依然在计时,回到Activity时,显示当前的计时状态. Timer 这个Java的类,具体看Java的API说明,但是要注意一点: Timer 在cancel后,需要重新new 一次. 首先要给计时器定义三个状态:准备,开始,暂停. public static

Date应用计时器和倒计时

计时器应用 目的:通过date设置一个计时器,实现图一效果,点击按钮开始计时,小时数.分钟数.秒数分别放到不同的表格中显示,中间用冒号相隔. 思路:第一步布局,要有3个input标签用来放置小时数.分钟数.秒数:要设置i.j.k三个变量来放置这三个value值,要有一个button按钮用来触发点击事件,还要一个计时器setInterval(function(){},1000);用来计时. 注意事项:为放置点击多次按钮导致的同时触发多个计时器累加的事情,我们需要提前声明 var oTime=nul

[Android Pro] CountDownTimer倒计时

定时执行在一段时候后停止的倒计时,在倒计时执行过程中会在固定间隔时间得到通知(译者:触发onTick方法),下面的例子显示在一个文本框中显示一个30s倒计时: new CountdownTimer(30000, 1000) { public void onTick(long millisUntilFinished) { mTextField.setText("seconds remaining: " + millisUntilFinished / 1000); } public voi

Android中的倒计时实现

一.android.os包下提供了倒计时的抽象工具类: public abstract class CountDownTimer { /** * Millis since epoch when alarm should stop. */ private final long mMillisInFuture; /** * The interval in millis that the user receives callbacks */ private final long mCountdownI

Android开发:验证码倒计时功能实现

前言 现在好多个APP里面都有验证码倒计时按钮,实现方式大概有下面几种: 1.使用线程和Handler的方式,定时刷新倒计时数字,这种方式容易导致内存泄露,所以一般都使用弱引用,控制数字的刷新. 2.自定义倒计时按钮 3.使用Android提供的CountDownTimer结合TextView实现倒计时功能 这篇主要就是说下用第三种方式实现,简单好用 效果图 实现 以下是核心代码: /** * Created by hfs on 2017/5/9. */ public class TimeCou