一、应该通过配合Handler来实现timer功能的!
- package com.ray.test;
- import java.util.Timer;
- import java.util.TimerTask;
- import android.app.Activity;
- import android.os.Bundle;
- import android.os.Handler;
- import android.os.Message;
- public class TestTimer extends Activity {
- Timer timer = new Timer();
- Handler handler = new Handler(){
- public void handleMessage(Message msg) {
- switch (msg.what) {
- case 1:
- setTitle("hear me?");
- break;
- }
- super.handleMessage(msg);
- }
- };
- TimerTask task = new TimerTask(){
- public void run() {
- Message message = new Message();
- message.what = 1;
- handler.sendMessage(message);
- }
- };
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- timer.schedule(task, 10000);
- }
- }
二、使用定时器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线程。
剩下的工作就简单多,添加一个Timer,可以让程序运行起来了
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 };
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(); // 退出计时器
2 timer.schedule(task, 1000 , 1000 ); // 延时1000ms后执行,1000ms执行一次
3 // timer.cancel(); // 退出计时器
三、Timer中的scheduleAtFixedRate 和schedule方法的区别
最近整了一个TimerTask 要求每天定点执行某一任务.
如果服务在当天00:01分以前被启动,两个方法都会在在00:01分时执行任务.
第二次任务执行时间都是00:01+24 * 60 * 60 * 1000,如果过了这个点后启服务两个方法都会马上执行任务.但第二次任务被执行的时间就是差别了,scheduleAtFixedRate是在你设置的date的基础上加24 * 60 * 60 * 1000这个时间段后执行而,schedule是在服务启动时间的基础上加24 * 60 * 60 * 1000这个时间段后执行.
如果你在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.
- import java.util.Calendar;
- import java.util.Date;
- import java.util.Timer;
- import java.util.TimerTask;
- import javax.servlet.ServletContextEvent;
- import javax.servlet.ServletContextListener;
- import org.apache.log4j.Logger;
- public class DoLogListener implements ServletContextListener {
- Timer t = null;
- public void contextInitialized(ServletContextEvent sce) {
- Calendar c = null;
- c = Calendar.getInstance();
- c.set(Calendar.HOUR_OF_DAY, 00);
- c.set(Calendar.MINUTE, 01);
- c.set(Calendar.SECOND, 00);
- Date date = c.getTime();
- t = new Timer();
- t.scheduleAtFixedRate(new TimerTask() {
- @Override
- public void run() {
- doSomething();
- }
- }, date, 24 * 60 * 60 * 1000);
- //t.schedule(new TimerTask() {
- // @Override
- // public void run() {
- // doSomething();
- // }
- //}, date, 24 * 60 * 60 * 1000);
- }
- public void contextDestroyed(ServletContextEvent sce) {
- t.cancel();
- }
- public void doSomething() {
- System.out.println("sb")
- }
- }
如果服务在当天00:01分以前被启动,两个方法都会在在00:01分时执行任务.
第二次任务执行时间都是00:01+24 * 60 * 60 * 1000,如果过了这个点后启服务两个方法都会马上执行任务.但第二次任务被执行的时间就是差别了,scheduleAtFixedRate是在你设置的date的基础上加24 * 60 * 60 * 1000这个时间段后执行而,schedule是在服务启动时间的基础上加24 * 60 * 60 * 1000这个时间段后执行.
- public static void main(String[] args) {
- Calendar c = Calendar.getInstance();
- c.set(2009, 04, 20, 11, 50,00);
- Date date = c.getTime();
- Timer t = new Timer();
- t.scheduleAtFixedRate(new TimerTask() {
- @Override
- public void run() {
- System.out.println("aaaaaaa");
- }
- }, date,2*60*1000);
- }
如果你在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.