Android中实现定时器的三种方法

来源:互联网 发布:什么叫绿鞋机制知乎 编辑:程序博客网 时间:2024/06/17 06:08

在Android开发中,定时器一般有以下3种实现方法:

一、采用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结合的方法

      Timer是一种定时器工具,用来在一个后台线程计划执行指定任务。它可以计划执行一个任务一次或反复多次。
TimerTask一个抽象类,它的子类代表一个可以被Timer计划的任务。

Timer和TimerTask可以做为实现线程的第三种方式,前两中方式分别是继承自Thread类和实现Runnable接口。

        Timer是一种线程设施,用于安排以后在后台线程中执行的任务。可安排任务执行一次,或者定期重复执行,可以看成一个定时器,可以调度TimerTask。TimerTask是一个抽象类,实现了Runnable接口,所以具备了多线程的能力。

import java.util.Timer; import java.util.TimerTask; public class TimerTest {       static class MyTimerTask1 extends TimerTask {     public void run() {            System.out.println("爆炸!!!");             }      }                    public static void main(String[] args) {             Timer timer = new Timer();             timer.schedule(new MyTimerTask1(), 5000);// 5秒后启动任务      } } 
schedule是Timer调度任务的方法,Timer重构了四个schedule方法,具体可以查看JDK API。

方法一:Handler+Thread
package com.xunfang.handerDemo;    import android.app.Activity;  import android.os.Bundle;  import android.os.Handler;  import android.os.Message;  import android.widget.TextView;    /**  * handler定时器  *   * @author Smalt  *   */  public class HanderDemoActivity extends Activity {      TextView tvShow;      private int i = 0;        @Override      public void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);          setContentView(R.layout.main);          tvShow = (TextView) findViewById(R.id.tv_show);          new Thread(new ThreadShow()).start();      }        // handler类接收数据      Handler handler = new Handler() {          public void handleMessage(Message msg) {              if (msg.what == 1) {                  tvShow.setText(Integer.toString(i++));                  System.out.println("receive....");              }          };      };        // 线程类      class ThreadShow implements Runnable {            @Override          public void run() {              // TODO Auto-generated method stub              while (true) {                  try {                      Thread.sleep(1000);                      Message msg = new Message();                      msg.what = 1;                      handler.sendMessage(msg);                      System.out.println("send...");                  } catch (Exception e) {                      // TODO Auto-generated catch block                      e.printStackTrace();                      System.out.println("thread error...");                  }              }          }      }  }  
方法二:Handler类自带的postDelyed
package com.xunfang.handerDemo;    import android.app.Activity;  import android.os.Bundle;  import android.os.Handler;  import android.widget.TextView;    /**  * handler定时器使用postDelyed实现  *   * @author Smalt  *   */  public class HanderDemoActivity extends Activity {      TextView tvShow;      private int i = 0;      private int TIME = 1000;        @Override      public void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);          setContentView(R.layout.main);          tvShow = (TextView) findViewById(R.id.tv_show);          handler.postDelayed(runnable, TIME); //每隔1s执行      }        Handler handler = new Handler();      Runnable runnable = new Runnable() {            @Override          public void run() {              // handler自带方法实现定时器              try {                  handler.postDelayed(this, TIME);                  tvShow.setText(Integer.toString(i++));                  System.out.println("do...");              } catch (Exception e) {                  // TODO Auto-generated catch block                  e.printStackTrace();                  System.out.println("exception...");              }          }      };    }  
方法三:

Handler+Timer+TimerTask

package com.xunfang.handerDemo;    import java.util.Timer;  import java.util.TimerTask;    import android.app.Activity;  import android.os.Bundle;  import android.os.Handler;  import android.os.Message;  import android.widget.TextView;    /**  * 定时器实现:Handler+Timer+TimerTask  *   * @author Smalt  *   */  public class HanderDemoActivity extends Activity {      TextView tvShow;      private int i = 0;      private int TIME = 1000;        @Override      public void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);          setContentView(R.layout.main);          tvShow = (TextView) findViewById(R.id.tv_show);          timer.schedule(task, 1000, 1000); // 1s后执行task,经过1s再次执行      }        Handler handler = new Handler() {          public void handleMessage(Message msg) {              if (msg.what == 1) {                  tvShow.setText(Integer.toString(i++));              }              super.handleMessage(msg);          };      };      Timer timer = new Timer();      TimerTask task = new TimerTask() {            @Override          public void run() {              // 需要做的事:发送消息              Message message = new Message();              message.what = 1;              handler.sendMessage(message);          }      };  }  

源码下载:

http://download.csdn.net/detail/u010963246/8900439

0 0
原创粉丝点击