android 的 Timer 类的用法

一、应该通过配合Handler来实现timer功能的!

Java代码  收藏代码
  1. package com.ray.test;  
  2.   
  3. import java.util.Timer;  
  4. import java.util.TimerTask;  
  5.   
  6. import android.app.Activity;  
  7. import android.os.Bundle;  
  8. import android.os.Handler;  
  9. import android.os.Message;  
  10.   
  11. public class TestTimer extends Activity {  
  12.   
  13.     Timer timer = new Timer();  
  14.     Handler handler = new Handler(){  
  15.   
  16.         public void handleMessage(Message msg) {  
  17.             switch (msg.what) {      
  18.             case 1:      
  19.                 setTitle("hear me?");  
  20.                 break;      
  21.             }      
  22.             super.handleMessage(msg);  
  23.         }  
  24.           
  25.     };  
  26.     TimerTask task = new TimerTask(){  
  27.   
  28.         public void run() {  
  29.             Message message = new Message();      
  30.             message.what = 1;      
  31.             handler.sendMessage(message);    
  32.         }  
  33.           
  34.     };  
  35.     public void onCreate(Bundle savedInstanceState) {  
  36.         super.onCreate(savedInstanceState);  
  37.         setContentView(R.layout.main);  
  38.         timer.schedule(task, 10000);  
  39.     }  
  40. }  


二、使用定时器Timer和TimerTask的启动、停止、暂停、继续等操作
一定要注意的几点问题,如下:
1.Timer和TimerTask在调用cancel()取消后不能再执行schedule语句
2. 只能在Ui主线程中更新控件/组件。在其他线程中,更新控件/组件会报错

三 、 这个实例化了一个Handler,Handler可以通过Message在多个线程通讯,我这里做的是定时recLen加1,然后以一定的格式,显示到recTime上(UI线程上的操作)。

 1 final Handler handler = new Handler(){  
 2     public void handleMessage(Message msg) {  
 3         switch (msg.what) {      
 4             case 1:      
 5                 recLen++;
 6         recTime.setText(GetRecTime(recLen));
 7                 break;      
 8             }      
 9             super.handleMessage(msg);  
10         }    
11     };  

下面定实例化一个TimerTask,这个是为Timer提供一个定时执行的内容。我在这个方法中加的是给Handler一个发送消息功能,因这在Timer的线程中,无法直接操作UI线程。
复制代码
1  TimerTask task  =   new  TimerTask(){  
2         public   void  run() {  
3        Message message  =   new  Message();      
4        message.what  =   1 ;      
5        handler.sendMessage(message);    
6     }  
7  };  
复制代码

剩下的工作就简单多,添加一个Timer,可以让程序运行起来了
1  timer  =   new  Timer( true );
2  timer.schedule(task, 1000 1000 );  // 延时1000ms后执行,1000ms执行一次
3  // timer.cancel();  // 退出计时器

 





  三、Timer中的scheduleAtFixedRate 和schedule方法的区别

最近整了一个TimerTask 要求每天定点执行某一任务. 
Java代码   收藏代码
  1. import java.util.Calendar;  
  2. import java.util.Date;  
  3. import java.util.Timer;  
  4. import java.util.TimerTask;  
  5.   
  6. import javax.servlet.ServletContextEvent;  
  7. import javax.servlet.ServletContextListener;  
  8.   
  9. import org.apache.log4j.Logger;  
  10.   
  11. public class DoLogListener implements ServletContextListener {  
  12.     Timer t = null;  
  13.   
  14.     public void contextInitialized(ServletContextEvent sce) {  
  15.         Calendar c = null;  
  16.         c = Calendar.getInstance();  
  17.         c.set(Calendar.HOUR_OF_DAY, 00);  
  18.         c.set(Calendar.MINUTE, 01);  
  19.         c.set(Calendar.SECOND, 00);  
  20.         Date date = c.getTime();  
  21.         t = new Timer();  
  22.         t.scheduleAtFixedRate(new TimerTask() {  
  23.             @Override  
  24.             public void run() {  
  25.                 doSomething();  
  26.             }  
  27.         }, date, 24 * 60 * 60 * 1000);  
  28.                   //t.schedule(new TimerTask() {  
  29.         //  @Override  
  30.         //  public void run() {  
  31.         //      doSomething();  
  32.         //  }  
  33.         //}, date, 24 * 60 * 60 * 1000);  
  34.   
  35.     }  
  36.   
  37.     public void contextDestroyed(ServletContextEvent sce) {  
  38.         t.cancel();  
  39.   
  40.     }  
  41.   
  42.     public void doSomething() {  
  43.           System.out.println("sb")  
  44.             }  
  45. }  

如果服务在当天00:01分以前被启动,两个方法都会在在00:01分时执行任务. 
第二次任务执行时间都是00:01+24 * 60 * 60 * 1000,如果过了这个点后启服务两个方法都会马上执行任务.但第二次任务被执行的时间就是差别了,scheduleAtFixedRate是在你设置的date的基础上加24 * 60 * 60 * 1000这个时间段后执行而,schedule是在服务启动时间的基础上加24 * 60 * 60 * 1000这个时间段后执行. 

Java代码   收藏代码
  1. public static void main(String[] args) {  
  2.     Calendar c = Calendar.getInstance();  
  3.     c.set(200904201150,00);  
  4.     Date date = c.getTime();  
  5.     Timer t = new Timer();  
  6.     t.scheduleAtFixedRate(new TimerTask() {  
  7.         @Override  
  8.         public void run() {  
  9.             System.out.println("aaaaaaa");  
  10.         }  
  11.     }, date,2*60*1000);  
  12. }  


如果你在11:55:00启动服务scheduleAtFixedRate在服务启动时任务就会被执行3次. 
11:50:00 第一次 
11:52:00 第二次 
11:54:00 第三次 
第四次的执行时间是:11:56:00 
如果用schedule在服务启动时任务只会被执行1次11:50:00第二次执行的时间是11:57:00.



  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android提供了几种定时器的实现方式,常见的有Handler、Timer和CountDownTimer。 1. 使用Handler实现定时器: 创建一个Handler对象,然后使用postDelayed()方法来延迟执行任务,并在任务中再次调用postDelayed()方法来实现循环执行。 示例代码如下: ```java Handler handler = new Handler(); Runnable runnable = new Runnable() { @Override public void run() { // 执行任务 // ... // 循环执行任务 handler.postDelayed(this, 1000); } }; // 开始定时器 handler.postDelayed(runnable, 1000); ``` 2. 使用Timer实现定时器: Timer是Java提供的定时器,可以使用TimerTask来定义定时任务,并使用schedule()方法来启动定时器。 示例代码如下: ```java Timer timer = new Timer(); TimerTask timerTask = new TimerTask() { @Override public void run() { // 执行任务 // ... } }; // 开始定时器,延迟1秒后执行任务,每隔1秒重复执行 timer.schedule(timerTask, 1000, 1000); ``` 3. 使用CountDownTimer实现倒计时: CountDownTimerAndroid提供的一个用于倒计时的,可以指定倒计时的总时间和间隔时间,并通过onTick()和onFinish()方法来处理倒计时过程中的操作。 示例代码如下: ```java CountDownTimer countDownTimer = new CountDownTimer(60000, 1000) { @Override public void onTick(long millisUntilFinished) { // 每隔1秒执行一次,剩余时间为millisUntilFinished // ... } @Override public void onFinish() { // 倒计时结束时执行的操作 // ... } }; // 开始倒计时 countDownTimer.start(); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值