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

所属分类: 软件编程 / Android 阅读数: 81
收藏 0 赞 0 分享

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

在一个安卓客户端项目中恰好遇到了类似的问题,一开始使用的是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样式和主题之选择器的实例讲解

今天小编就为大家分享一篇关于Android样式和主题之选择器的实例讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
收藏 0 赞 0 分享

Android应用动态修改主题的方法示例

今天小编就为大家分享一篇关于Android应用动态修改主题的方法示例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
收藏 0 赞 0 分享

Flutter 网络请求框架封装详解

这篇文章主要介绍了Flutter 网络请求框架封装详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

Flutter倒计时/计时器的实现代码

这篇文章主要介绍了Flutter倒计时/计时器的实现代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

Android使用google breakpad捕获分析native cash

这篇文章主要介绍了Android使用google breakpad捕获分析native cash 的相关知识,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

详解Flutter WebView与JS互相调用简易指南

这篇文章主要介绍了详解Flutter WebView与JS互相调用简易指南,分为JS调用Flutter和Flutter调用JS,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

Android开发实现ListView和adapter配合显示图片和文字列表功能示例

这篇文章主要介绍了Android开发实现ListView和adapter配合显示图片和文字列表功能,涉及Android使用ListView结合adapter适配器实现图文显示功能相关的布局、解析、权限控制等操作技巧,需要的朋友可以参考下
收藏 0 赞 0 分享

Android文字基线Baseline算法的使用讲解

今天小编就为大家分享一篇关于Android文字基线Baseline算法的使用讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
收藏 0 赞 0 分享

Flutter自定义实现神奇动效的卡片切换视图的示例代码

这篇文章主要介绍了Flutter自定义实现神奇动效的卡片切换视图的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

Android实现自定义滑动刻度尺方法示例

这篇文章主要给大家介绍了关于Android实现自定义滑动刻度尺的相关资料,文中通过示例代码介绍的非常详细,对各位Android开发者们具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
收藏 0 赞 0 分享
查看更多