Android實現計時與倒數計時的幾種方法

yangxi_001發表於2014-10-21

轉自:http://blog.csdn.net/ithomer/article/details/6903084

方法一

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. }  


方法二

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. }  

方法三

Handler與Message(不用TimerTask)

  1. public class timerTask extends Activity{  
  2.     private int recLen = 11;  
  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.         Message message = handler.obtainMessage(1);     // Message  
  12.         handler.sendMessageDelayed(message, 1000);  
  13.     }    
  14.   
  15.     final Handler handler = new Handler(){  
  16.   
  17.         public void handleMessage(Message msg){         // handle message  
  18.             switch (msg.what) {  
  19.             case 1:  
  20.                 recLen--;  
  21.                 txtView.setText("" + recLen);  
  22.   
  23.                 if(recLen > 0){  
  24.                     Message message = handler.obtainMessage(1);  
  25.                     handler.sendMessageDelayed(message, 1000);      // send message  
  26.                 }else{  
  27.                     txtView.setVisibility(View.GONE);  
  28.                 }  
  29.             }  
  30.   
  31.             super.handleMessage(msg);  
  32.         }  
  33.     };  
  34. }  

方法四

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.                 }  
  36.             }  
  37.         }  
  38.     }  
  39. }  

方法五

Handler與Runnable(最簡單型)

  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.         handler.postDelayed(runnable, 1000);  
  12.     }     
  13.   
  14.     Handler handler = new Handler();  
  15.     Runnable runnable = new Runnable() {  
  16.         @Override  
  17.         public void run() {  
  18.             recLen++;  
  19.             txtView.setText("" + recLen);  
  20.             handler.postDelayed(this1000);  
  21.         }  
  22.     };  
  23. }  

計時與倒數計時

方法1,方法2和方法3,都是倒數計時

方法4,方法5,都是計時

計時和倒數計時,都可使用上述方法實現(程式碼稍加改動)


UI執行緒比較

方法1,方法2和方法3,都是在UI執行緒實現的計時;

方法4和方法5,是另開Runnable執行緒實現計時


實現方式比較

方法1,採用的是Java實現,即Timer和TimerTask方式;

其它四種方法,都採用了Handler訊息處理


推薦使用

如果對UI執行緒互動要求不很高,可以選擇方法2和方法3

如果考慮到UI執行緒阻塞,嚴重影響到使用者體驗,推薦使用方法4,另起執行緒單獨用於計時和其它的邏輯處理

方法5,綜合了前幾種方法的優點,是最簡的



參考推薦:

Android之多執行緒工作-AsyncTask與handler

相關文章