android 的 Timer 类的用法
2014-03-10 11:19
288 查看
一、应该通过配合Handler来实现timer功能的!
Java代码
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线程。
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(); //退出计时器
最近整了一个TimerTask 要求每天定点执行某一任务.
Java代码
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这个时间段后执行.
Java代码
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.
Java代码
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线程。
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代码
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这个时间段后执行.
Java代码
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.
相关文章推荐
- Java中的Timer和TimerTask在Android中的用法
- Android 计时器Timer用法 (定时执行任务)
- Android Timer 的用法示例
- Android 计时器Timer用法
- Java中的Timer和TimerTask在Android中的用法
- Android 计时器Timer用法
- Android 计时器Timer用法
- android timer与handler的用法体会
- Android 计时器Timer用法
- [Android] Android中Timer的用法
- Android 计时器Timer用法
- Java中的Timer和TimerTask在Android中的用法
- Java中的Timer和TimerTask在Android中的用法
- Java中的Timer和TimerTask在Android中的用法
- 解析Java中的Timer和TimerTask在Android中的用法和实例
- Java中的Timer和TimerTask在Android中的用法
- Android 计时器Timer用法
- Java中的Timer和TimerTask在Android中的用法
- Java中的Timer和TimerTask在Android中的用法
- Android 计时器Timer用法