您的位置:首页 > 移动开发 > Android开发

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(); //退出计时器




三、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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: