android定时器的用法总结

来源:互联网 发布:linux vim环境配置 编辑:程序博客网 时间:2024/05/16 18:07

在android中,經常用到的定時器主要有以下幾種實現:
一、採用Handler與線程的sleep(long )方法
二、採用Handler的postDelayed(Runnable, long) 方法
三、採用Handler與timer及TimerTask結合的方法。
下面逐一介紹:
一、採用Handle與線程的sleep(long )方法
Handler主要用來處理接受到的消息。這只是最主要的方法,當然Handler裡還有其他的方法供實現,有興趣的可以去查API,這裡不過多解釋。
1.定義一個Handler類,用於處理接受到的Message.

Handler handler = new Handler() {   public void handleMessage(Message msg) {    //要做的事情    super.handleMessage(msg);   }};
2.新建一個實現Runnable接口的線程類。如下:
public class MyThread implements Runnable{   @Override   public void run() {    // TODO Auto-generated method stub    while (true) {     try {      Thread.sleep(10000);//線程暫停10秒,單位毫秒      Message message=new Message();      message.what=1;      handler.sendMessage(message);//發送消息     } catch (InterruptedException e) {      // TODO Auto-generated catch block      e.printStackTrace();     }    }   }}
3.在需要啟動線程的地方加入下面語句:
new Thread(new MyThread()).start();
4.啟動線程後,線程每10s發送一次消息。
二、採用Handler的postDelayed(Runnable, long) 方法
這個實現比較簡單一些:
1. 创建Handler实例

Handler handler=new Handler();Runnable runnable=new Runnable(){   @Override   public void run() {    // TODO Auto-generated method stub    //要做的事情    handler.postDelayed(this, 2000);   } };
2.啟動計時器:
handler.postDelayed(runnable, 2000);//每兩秒執行一次runnable.
3.停止計時器:
handler.removeCallbacks(runnable);
三、採用Handler與timer及TimerTask結合的方法。

1.定義定時器、定時器任務及Handler句柄

private final Timer timer = new Timer();private TimerTask task;Handler handler = new Handler() {   @Override   public void handleMessage(Message msg) {    // TODO Auto-generated method stub    //要做的事情,比如更新UI    switch(msg.what){    case:1         recTime.setText(GetRecTime(recLen));         break;    case:2        ...    super.handleMessage(msg);   }  };

2.初始化計時器任務。
task = new TimerTask() {    @Override    public void run() {     // TODO Auto-generated method stub     Message message = new Message();     message.what = 1;     handler.sendMessage(message);    }   };

3.啟動定時器

timer = new Timer(true);timer.schedule(task,1000, 1000); //延时1000ms后执行,1000ms执行一次//timer.cancel(); //退出计时器

对比错误写法,也许能让大家更快的明白过来


1TimerTask task = new TimerTask(){  
2    public void run() {  
3        recLen++;
4        recTime.setText(GetRecTime(recLen));//直接在TimerTask中操作UI线程,单步调试的时候发现,程序根本就没执行到这里
5    }
  
6}
;  
7timer = new Timer(true);
8timer.schedule(task,10001000);  

簡要說一下上面三步提到的一些內容。
1.定時器任務(TimerTask)顧名思義,就是說當定時器到達指定的時間時要做的工作,這裡是想Handler發送一個消息,由Handler類進行處理。
2. java.util.Timer.schedule(TimerTask task, long delay):這個方法是說,dalay/1000秒後執行task.只執行一次。
java.util.Timer.schedule(TimerTask task, long delay, long period):這個方法是說,delay/1000秒後執行task,然後進過period/1000秒再次執行task,這個用於循環任務,執行無數次,當然,你可以用timer.cancel();取消計時器的執行。

 

-------------------------------------------------------------2011/3/23------------------------------------------------------------------

如果我們採用第一種方法,如何結束掉線程呢?當然如果你的程序在run方法裡有做控制,線程就不用結束,當run方法運行完畢,線程也就隨之結束。那今天就說一下在Handler裡面對線程的控制,如果想要在Handler裡面結束線程,可用:

Thread.currentThread().interrupt();

Thread.currentThread()可以獲得消息發送的線程,interrupt即是中斷。

http://blog.csdn.net/acm2008/article/details/7050313


附加Java中定时器用法:

1、在应用开发中,经常需要一些周期性的操作,比如每5分钟执行某一操作等。对于这样的操作最方便、高效的实现方式就是使用java.util.Timer工具类。

private java.util.Timer timer; 
timer = new Timer(true); 
timer.schedule(
new java.util.TimerTask() { public void run() { //server.checkNewMail(); 要操作的方法 } }, 0, 5*60*1000); 
      第一个参数是要操作的方法,第二个参数是要设定延迟的时间,第三个参数是周期的设定,每隔多长时间执行该操作。

    使用这几行代码之后,Timer本身会每隔5分钟调用一遍server.checkNewMail()方法,不需要自己启动线程。Timer本身也是多线程同步的,多个线程可以共用一个Timer,不需要外部的同步代码。

2、
(1)Timer.schedule(TimerTask task,Date time)安排在制定的时间执行指定的任务。
(2)Timer.schedule(TimerTask task,Date firstTime ,long period)安排指定的任务在指定的时间开始进行重复的固定延迟执行.
(3)Timer.schedule(TimerTask task,long delay)安排在指定延迟后执行指定的任务.
(4)Timer.schedule(TimerTask task,long delay,long period)安排指定的任务从指定的延迟后开始进行重复的固定延迟执行.
(5)Timer.scheduleAtFixedRate(TimerTask task,Date firstTime,long period)安排指定的任务在指定的时间开始进行重复的固定速率执行.
(6)Timer.scheduleAtFixedRate(TimerTask task,long delay,long period)安排指定的任务在指定的延迟后开始进行重复的固定速率执行.
import java.util.concurrent.Executors;  import java.util.concurrent.ScheduledExecutorService;  import java.util.concurrent.TimeUnit;    public class T implements Runnable {      private String jobName = "";        public T(String jobName) {          super();          this.jobName = jobName;      }        @Override      public void run() {          System.out.println("execute " + jobName);      }        public static void main(String[] args) {          ScheduledExecutorService service = Executors.newScheduledThreadPool(10);            long initialDelay1 = 1;          long period1 = 1;          // 从现在开始1秒钟之后,每隔1秒钟执行一次job1          service.scheduleAtFixedRate(                  new T("job1"), initialDelay1,                  period1, TimeUnit.SECONDS);            long initialDelay2 = 1;          long delay2 = 1;          // 从现在开始2秒钟之后,每隔2秒钟执行一次job2          service.scheduleWithFixedDelay(                  new T("job2"), initialDelay2,                  delay2, TimeUnit.SECONDS);      }  }  


原创粉丝点击