Android計時與倒計時的幾種方法

方法一

Timer與TimerTask(Java實現)

  1. public class timerTask extends Activity{    
  2.    
  3.     private int recLen = 11;    
  4.     private TextView txtView;    
  5.     Timer timer = new Timer();    
  6.    
  7.     public void onCreate(Bundle savedInstanceState){    
  8.         super.onCreate(savedInstanceState);    
  9.             
  10.         setContentView(R.layout.timertask);    
  11.         txtView = (TextView)findViewById(R.id.txttime);    
  12.             
  13.         timer.schedule(task, 10001000);       // timeTask    
  14.     }       
  15.    
  16.     TimerTask task = new TimerTask() {    
  17.         @Override    
  18.         public void run() {    
  19.    
  20.             runOnUiThread(new Runnable() {      // UI thread    
  21.                 @Override    
  22.                 public void run() {    
  23.                     recLen–;    
  24.                     txtView.setText(”“+recLen);    
  25.                     if(recLen < 0){    
  26.                         timer.cancel();    
  27.                         txtView.setVisibility(View.GONE);    
  28.                     }    
  29.                 }    
  30.             });    
  31.         }    
  32.     };    
  33. }    
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的改進型)

  1. public class timerTask extends Activity{    
  2.     private int recLen = 11;    
  3.     private TextView txtView;    
  4.     Timer timer = new Timer();    
  5.    
  6.     public void onCreate(Bundle savedInstanceState){    
  7.         super.onCreate(savedInstanceState);    
  8.    
  9.         setContentView(R.layout.timertask);    
  10.         txtView = (TextView)findViewById(R.id.txttime);    
  11.    
  12.         timer.schedule(task, 10001000);       // timeTask    
  13.     }       
  14.    
  15.     final Handler handler = new Handler(){    
  16.         @Override    
  17.         public void handleMessage(Message msg){    
  18.             switch (msg.what) {    
  19.             case 1:    
  20.                 txtView.setText(”“+recLen);    
  21.                 if(recLen < 0){    
  22.                     timer.cancel();    
  23.                     txtView.setVisibility(View.GONE);    
  24.                 }    
  25.             }    
  26.         }    
  27.     };    
  28.    
  29.     TimerTask task = new TimerTask() {    
  30.         @Override    
  31.         public void run() {    
  32.             recLen–;    
  33.             Message message = new Message();    
  34.             message.what = 1;    
  35.             handler.sendMessage(message);    
  36.         }    
  37.     };    
  38. }  
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);  
        }  
    };  
}


方法三

  1. Handler與Message(不用TimerTask)  
  2.   
  3. public class timerTask extends Activity{    
  4.     private int recLen = 11;    
  5.     private TextView txtView;    
  6.    
  7.     public void onCreate(Bundle savedInstanceState) {      
  8.         super.onCreate(savedInstanceState);      
  9.    
  10.         setContentView(R.layout.timertask);     
  11.         txtView = (TextView)findViewById(R.id.txttime);    
  12.    
  13.         Message message = handler.obtainMessage(1);     // Message    
  14.         handler.sendMessageDelayed(message, 1000);    
  15.     }      
  16.    
  17.     final Handler handler = new Handler(){    
  18.    
  19.         public void handleMessage(Message msg){         // handle message    
  20.             switch (msg.what) {    
  21.             case 1:    
  22.                 recLen–;    
  23.                 txtView.setText(”“ + recLen);    
  24.    
  25.                 if(recLen > 0){    
  26.                     Message message = handler.obtainMessage(1);    
  27.                     handler.sendMessageDelayed(message, 1000);      // send message    
  28.                 }else{    
  29.                     txtView.setVisibility(View.GONE);    
  30.                 }    
  31.             }    
  32.    
  33.             super.handleMessage(msg);    
  34.         }    
  35.     };    
  36. }    
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線程)

  1. public class timerTask extends Activity{    
  2.     private int recLen = 0;    
  3.     private TextView txtView;    
  4.    
  5.     public void onCreate(Bundle savedInstanceState){    
  6.         super.onCreate(savedInstanceState);    
  7.    
  8.         setContentView(R.layout.timertask);    
  9.         txtView = (TextView)findViewById(R.id.txttime);    
  10.             
  11.         new Thread(new MyThread()).start();         // start thread    
  12.     }       
  13.    
  14.     final Handler handler = new Handler(){          // handle    
  15.         public void handleMessage(Message msg){    
  16.             switch (msg.what) {    
  17.             case 1:    
  18.                 recLen++;    
  19.                 txtView.setText(”“ + recLen);    
  20.             }    
  21.             super.handleMessage(msg);    
  22.         }    
  23.     };    
  24.    
  25.     public class MyThread implements Runnable{      // thread    
  26.         @Override    
  27.         public void run(){    
  28.             while(true){    
  29.                 try{    
  30.                     Thread.sleep(1000);     // sleep 1000ms    
  31.                     Message message = new Message();    
  32.                     message.what = 1;    
  33.                     handler.sendMessage(message);    
  34.                 }catch (Exception e) {    
  35.                 }   
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) {  
                } 


方法五

  1. Handler與Runnable(最簡單型)    
  2.   
  3. public class timerTask extends Activity{    
  4.     private int recLen = 0;    
  5.     private TextView txtView;    
  6.    
  7.     public void onCreate(Bundle savedInstanceState){    
  8.         super.onCreate(savedInstanceState);    
  9.    
  10.         setContentView(R.layout.timertask);    
  11.         txtView = (TextView)findViewById(R.id.txttime);    
  12.             
  13.         handler.postDelayed(runnable, 1000);    
  14.     }       
  15.    
  16.     Handler handler = new Handler();    
  17.     Runnable runnable = new Runnable() {    
  18.         @Override    
  19.         public void run() {    
  20.             recLen++;    
  21.             txtView.setText(”“ + recLen);    
  22.             handler.postDelayed(this1000);    
  23.         }    
  24.     };    
  25. }    
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,綜合了前幾種方法的優點,是最簡的 

發佈了3 篇原創文章 · 獲贊 30 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章