欢迎来到代码驿站!

Android代码

当前位置:首页 > 移动开发 > Android代码

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

时间:2021-03-18 09:46:22|栏目:Android代码|点击:

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

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

效果如图:

方法一

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);  
    runnable.run();  
  }    
  
  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,综合了前几种方法的优点,是最简的

上一篇:Android中使用socket使底层和framework通信的实现方法

栏    目:Android代码

下一篇:Android积分签到上移消失动画效果

本文标题:Android计时与倒计时实现限时抢购的5种方法

本文地址:http://www.codeinn.net/misctech/83260.html

推荐教程

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:914707363 | 邮箱:codeinn#126.com(#换成@)

Copyright © 2020 代码驿站 版权所有