赞
踩
在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 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(); //退出计时器
对比错误写法,也许能让大家更快的明白过来
-------------------------------------------------------------2011/3/23------------------------------------------------------------------
如果我們採用第一種方法,如何結束掉線程呢?當然如果你的程序在run方法裡有做控制,線程就不用結束,當run方法運行完畢,線程也就隨之結束。那今天就說一下在Handler裡面對線程的控制,如果想要在Handler裡面結束線程,可用:
Thread.currentThread().interrupt();
Thread.currentThread()可以獲得消息發送的線程,interrupt即是中斷。
http://blog.csdn.net/acm2008/article/details/7050313
附加Java中定时器用法:
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,不需要外部的同步代码。
- 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);
- }
- }

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。