Android实现计时与倒计时(限时抢购)的几种方法

Android实现计时与倒计时(限时抢购)的几种方法



在购物网站的促销活动中一般都有倒计时限制购物时间或者折扣的时间,这些都是如何实现的呢?

在一个安卓客户端项目中恰好遇到了类似的问题,一开始使用的是Timer与 TimerTask, 虽然此方法通用,但后来考虑在安卓中是否有更佳的方案,于是乎共找到以下五种实现方案,另外还有一种使用CountDownTimer进行计时的方面,我会在单独的文章中进行介绍

效果如图:



方法一

Timer与TimerTask(Java实现)

[java] view plaincopy
  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 plaincopy
  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. }    



方法三

[java] view plaincopy
  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与Thread(不占用UI线程)

[java] view plaincopy
  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.      



方法五

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



计时与倒计时
方法1,方法2和方法3,都是倒计时
方法4,方法5,都是计时
计时和倒计时,都可使用上述方法实现(代码稍加改动)

UI线程比较
方法1,方法2和方法3,都是在UI线程实现的计时;
方法4和方法5,是另开Runnable线程实现计时

实现方式比较
方法1,采用的是Java实现,即Timer和TimerTask方式;
其它四种方法,都采用了Handler消息处理

推荐使用
如果对UI线程交互要求不很高,可以选择方法2和方法3
如果考虑到UI线程阻塞,严重影响到用户体验,推荐使用方法4,另起线程单独用于计时和其它的逻辑处理

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值