Android实现计时与倒计时的5种方法

方法一

Timer与TimerTask(Java实现)

[java] view plaincopyprint?

  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的改进型)

[java] view plaincopyprint?

  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)

[java] view plaincopyprint?

  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线程)

[java] view plaincopyprint?

  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(最简单型)

[java] view plaincopyprint?

  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,方法,倒计时)