zoukankan      html  css  js  c++  java
  • Android实现计时与倒计时的几种方法

    方法一

    Timer与TimerTask(Java实现)

    public class timerTask extends Activity{

     private int recLen = 11;
     private TextView txtView;
     Timer timer = new Timer();

     public void onCreate(Bundle savedInstanceState){
      super.onCreate(savedInstanceState);
      
      setContentView(R.layout.timertask);
      txtView = (TextView)findViewById(R.id.txttime);
      
      timer.schedule(task, 1000, 1000);  // timeTask
     } 

     TimerTask task = new TimerTask() {
      @Override
      public void run() {

       runOnUiThread(new Runnable() {  // UI thread
        @Override
        public void run() {
         recLen--;
         txtView.setText(""+recLen);
         if(recLen < 0){
          timer.cancel();
          txtView.setVisibility(View.GONE);
         }
        }
       });
      }
     };
    }

    方法二

    TimerTask与Handler(不用Timer的改进型)

    public class timerTask extends Activity{
     private int recLen = 11;
     private TextView txtView;
     Timer timer = new Timer();

     public void onCreate(Bundle savedInstanceState){
      super.onCreate(savedInstanceState);

      setContentView(R.layout.timertask);
      txtView = (TextView)findViewById(R.id.txttime);

      timer.schedule(task, 1000, 1000);  // timeTask
     } 

     final Handler handler = new Handler(){
      @Override
      public void handleMessage(Message msg){
       switch (msg.what) {
       case 1:
        txtView.setText(""+recLen);
        if(recLen < 0){
         timer.cancel();
         txtView.setVisibility(View.GONE);
        }
       }
      }
     };

     TimerTask task = new TimerTask() {
      @Override
      public void run() {
       recLen--;
       Message message = new Message();
       message.what = 1;
       handler.sendMessage(message);
      }
     };
    }

    方法三

    Handler与Message(不用TimerTask)

    public class timerTask extends Activity{
     private int recLen = 11;
     private TextView txtView;

     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 

      setContentView(R.layout.timertask);
      txtView = (TextView)findViewById(R.id.txttime);

      Message message = handler.obtainMessage(1);  // Message
      handler.sendMessageDelayed(message, 1000);
     } 

     final Handler handler = new Handler(){

      public void handleMessage(Message msg){   // handle message
       switch (msg.what) {
       case 1:
        recLen--;
        txtView.setText("" + recLen);

        if(recLen > 0){
         Message message = handler.obtainMessage(1);
         handler.sendMessageDelayed(message, 1000);  // send message
        }else{
         txtView.setVisibility(View.GONE);
        }
       }

       super.handleMessage(msg);
      }
     };
    }

    方法四

    Handler与Thread(不占用UI线程)

    public class timerTask extends Activity{
     private int recLen = 0;
     private TextView txtView;

     public void onCreate(Bundle savedInstanceState){
      super.onCreate(savedInstanceState);

      setContentView(R.layout.timertask);
      txtView = (TextView)findViewById(R.id.txttime);
      
      new Thread(new MyThread()).start();   // start thread
     } 

     final Handler handler = new Handler(){   // handle
      public void handleMessage(Message msg){
       switch (msg.what) {
       case 1:
        recLen++;
        txtView.setText("" + recLen);
       }
       super.handleMessage(msg);
      }
     };

     public class MyThread implements Runnable{  // thread
      @Override
      public void run(){
       while(true){
        try{
         Thread.sleep(1000);  // sleep 1000ms
         Message message = new Message();
         message.what = 1;
         handler.sendMessage(message);
        }catch (Exception e) {
        }
       }
      }
     }
    }

    方法五

    Handler与Runnable(最简单型)

    public class timerTask extends Activity{
     private int recLen = 0;
     private TextView txtView;

     public void onCreate(Bundle savedInstanceState){
      super.onCreate(savedInstanceState);

      setContentView(R.layout.timertask);
      txtView = (TextView)findViewById(R.id.txttime);
      
      handler.postDelayed(runnable, 1000);
     } 

     Handler handler = new Handler();
     Runnable runnable = new Runnable() {
      @Override
      public void run() {
       recLen++;
       txtView.setText("" + recLen);
       handler.postDelayed(this, 1000);
      }
     };
    }

    计时与倒计时

    方法1,方法2和方法3,都是倒计时

    方法4,方法5,都是计时

    计时和倒计时,都可使用上述方法实现(代码稍加改动)

    UI线程比较

    方法1,方法2和方法3,都是在UI线程实现的计时;

    方法4和方法5,是另开Runnable线程实现计时

    实现方式比较

    方法1,采用的是Java实现,即Timer和TimerTask方式;

    其它四种方法,都采用了Handler消息处理

    推荐使用

    如果对UI线程交互要求不很高,可以选择方法2和方法3

    如果考虑到UI线程阻塞,严重影响到用户体验,推荐使用方法4,另起线程单独用于计时和其它的逻辑处理

    方法5,综合了前几种方法的优点,是最简的

  • 相关阅读:
    HDU 2433 Travel (最短路,BFS,变形)
    HDU 2544 最短路 (最短路,spfa)
    HDU 2063 过山车 (最大匹配,匈牙利算法)
    HDU 1150 Machine Schedule (最小覆盖,匈牙利算法)
    290 Word Pattern 单词模式
    289 Game of Life 生命的游戏
    287 Find the Duplicate Number 寻找重复数
    283 Move Zeroes 移动零
    282 Expression Add Operators 给表达式添加运算符
    279 Perfect Squares 完美平方数
  • 原文地址:https://www.cnblogs.com/nan325/p/3326664.html
Copyright © 2011-2022 走看看