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

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

效果如图:

方法一

Timer与TimerTask(Java实现)

[java] view plaincopy
  1. public class timerTask extends Activity{
  2. private int recLen = 11;
  3. private TextView txtView;
  4. Timer timer = new Timer();
  5. public void onCreate(Bundle savedInstanceState){
  6. super.onCreate(savedInstanceState);
  7. setContentView(R.layout.timertask);
  8. txtView = (TextView)findViewById(R.id.txttime);
  9. timer.schedule(task, 1000, 1000);       // timeTask
  10. }
  11. TimerTask task = new TimerTask() {
  12. @Override
  13. public void run() {
  14. runOnUiThread(new Runnable() {      // UI thread
  15. @Override
  16. public void run() {
  17. recLen--;
  18. txtView.setText(""+recLen);
  19. if(recLen < 0){
  20. timer.cancel();
  21. txtView.setVisibility(View.GONE);
  22. }
  23. }
  24. });
  25. }
  26. };
  27. }

方法二
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. public void onCreate(Bundle savedInstanceState){
  6. super.onCreate(savedInstanceState);
  7. setContentView(R.layout.timertask);
  8. txtView = (TextView)findViewById(R.id.txttime);
  9. timer.schedule(task, 1000, 1000);       // timeTask
  10. }
  11. final Handler handler = new Handler(){
  12. @Override
  13. public void handleMessage(Message msg){
  14. switch (msg.what) {
  15. case 1:
  16. txtView.setText(""+recLen);
  17. if(recLen < 0){
  18. timer.cancel();
  19. txtView.setVisibility(View.GONE);
  20. }
  21. }
  22. }
  23. };
  24. TimerTask task = new TimerTask() {
  25. @Override
  26. public void run() {
  27. recLen--;
  28. Message message = new Message();
  29. message.what = 1;
  30. handler.sendMessage(message);
  31. }
  32. };
  33. }

方法三

[java] view plaincopy
  1. Handler与Message(不用TimerTask)
  2. public class timerTask extends Activity{
  3. private int recLen = 11;
  4. private TextView txtView;
  5. public void onCreate(Bundle savedInstanceState) {
  6. super.onCreate(savedInstanceState);
  7. setContentView(R.layout.timertask);
  8. txtView = (TextView)findViewById(R.id.txttime);
  9. Message message = handler.obtainMessage(1);     // Message
  10. handler.sendMessageDelayed(message, 1000);
  11. }
  12. final Handler handler = new Handler(){
  13. public void handleMessage(Message msg){         // handle message
  14. switch (msg.what) {
  15. case 1:
  16. recLen--;
  17. txtView.setText("" + recLen);
  18. if(recLen > 0){
  19. Message message = handler.obtainMessage(1);
  20. handler.sendMessageDelayed(message, 1000);      // send message
  21. }else{
  22. txtView.setVisibility(View.GONE);
  23. }
  24. }
  25. super.handleMessage(msg);
  26. }
  27. };
  28. }

方法四

Handler与Thread(不占用UI线程)

[java] view plaincopy
  1. public class timerTask extends Activity{
  2. private int recLen = 0;
  3. private TextView txtView;
  4. public void onCreate(Bundle savedInstanceState){
  5. super.onCreate(savedInstanceState);
  6. setContentView(R.layout.timertask);
  7. txtView = (TextView)findViewById(R.id.txttime);
  8. new Thread(new MyThread()).start();         // start thread
  9. }
  10. final Handler handler = new Handler(){          // handle
  11. public void handleMessage(Message msg){
  12. switch (msg.what) {
  13. case 1:
  14. recLen++;
  15. txtView.setText("" + recLen);
  16. }
  17. super.handleMessage(msg);
  18. }
  19. };
  20. public class MyThread implements Runnable{      // thread
  21. @Override
  22. public void run(){
  23. while(true){
  24. try{
  25. Thread.sleep(1000);     // sleep 1000ms
  26. Message message = new Message();
  27. message.what = 1;
  28. handler.sendMessage(message);
  29. }catch (Exception e) {
  30. }

方法五

[java] view plaincopy
  1. Handler与Runnable(最简单型)
  2. public class timerTask extends Activity{
  3. private int recLen = 0;
  4. private TextView txtView;
  5. public void onCreate(Bundle savedInstanceState){
  6. super.onCreate(savedInstanceState);
  7. setContentView(R.layout.timertask);
  8. txtView = (TextView)findViewById(R.id.txttime);
  9. runnable.run();
  10. }
  11. Handler handler = new Handler();
  12. Runnable runnable = new Runnable() {
  13. @Override
  14. public void run() {
  15. recLen++;
  16. txtView.setText("" + recLen);
  17. handler.postDelayed(this, 1000);
  18. }
  19. };
  20. }

计时与倒计时
方法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实现计时与倒计时(限时抢购)的几种方法相关推荐

  1. Android实现计时与倒计时(限时抢购)

    平常生活中我们会看到很多APP都有倒计时的功能,对于开发这而言倒计时是怎么实现的呢?其实非常简单我们只需要通过handler来发送消息就可以简单实现. 下面是代码演示: 在布局文件中: <Rel ...

  2. android 商品倒计时,Android计时与倒计时实现限时抢购的5种方法

    在购物网站的促销活动中一般都有倒计时限制购物时间或者折扣的时间,这些都是如何实现的呢? 在一个安卓客户端项目中恰好遇到了类似的问题,一开始使用的是Timer与 TimerTask, 虽然此方法通用,但 ...

  3. android全局计时_Android中使用定时器的三种方法

    本文实例为大家分享了Android中使用定时器的三种方法,供大家参考,具体内容如下 图示: 因为都比较简单,所以就直接贴代码(虑去再次点击停止的操作),有个全局的Handler负责接收消息更新UI 第 ...

  4. javascript毫秒计时器_基于javascript实现精确到毫秒的倒计时限时抢购

    这篇文章为大家分享了javascript实现倒计时限时抢购,精确到毫秒的倒计时,供大家参考,具体内容如下 一.效果图 下面的图片就是聚划算上面的限时抢的效果 二.实现限时抢的效果需要用到的知识 :Ja ...

  5. 【Android】Eclipse自动编译NDK/JNI的三种方法

    [Android]Eclipse自动编译NDK/JNI的三种方法 SkySeraph Sep. 18th  2014 Email:skyseraph00@163.com 更多精彩请直接访问SkySer ...

  6. android fragment传递参数_fragment之间传值的两种方法

    在Activity中加载Fragment的时候.有时候要使用多个Fragment切换.并传值到另外一个Fragment.也就是说两个Fragment之间进行参数的传递.查了很多资料.找到两种方法.一种 ...

  7. android 漫画切换,Android逆向之路---让我们试试另一种方法看漫画-(2)

    前言 上次我们分析到了快看漫画的协议部分,这次我们根据他的协议来手动写个脚本,然后执行以后,可以把他的漫画自动下载到电脑上面, 然后自动拼接图片,这样就可以实现在电脑上当成一个长图来看漫画了,没有广告 ...

  8. Android实现计时与倒计时的几种方法

    方法一 Timer与TimerTask(Java实现) public class timerTask extends Activity{ private int recLen = 11; privat ...

  9. android 获取当前时间精确到毫秒的两种方法

    1.概述 在android app开发中,在项目中有些功能需求要求要获取当前时间精确到毫秒,已便于完成功能开发的需要,而在android 的系统api中提供了SimpleDateFormat和Cale ...

最新文章

  1. 怎么在电脑上使用python-开始在 Windows 上使用 Python(初学者)
  2. 初学者学python好还是c-入门是不是应该选择C而不是直接学Python?
  3. 网络编程预备知识之IP地址和端口
  4. mysql 删除数据后myd_Windows下的MySQL删除data文件夹后……
  5. 2019中韩版权研讨会举行 网络成版权保护主战场
  6. 启明云端WT516P6Core离线语音模块发布后,开发者朋友提出的问题最多的是:是否可以自己编译指令
  7. 用原生JS实现旋转轮播图
  8. python3 打印_Python 3 进阶 —— print 打印和输出
  9. unbuntu管理员的切换
  10. php符号%3c%3e啥意思,[PHP防火墙]输入内容存在危险字符,安全起见,已被本站拦截...
  11. 商城网站该如何选择虚拟主机
  12. 如何设置Android Studio绘制布局时的视图
  13. 广州地铁线路查询程序C语言,c语言广州地铁系统报错,帮帮忙看一看哈?
  14. 【avx2】VitrualBox 安装centos7 支持avx2
  15. 【面试】计算机操作系统
  16. 手机打字测速软件简版
  17. python尼姆游戏_python实现聪明的尼姆游戏(人机对战)
  18. 从1到N 第十二届中国IDC产业年度大典在京启幕
  19. cmake错误:Could not find a configuration file for package “Eigen3“
  20. 医院室内定位导航,便捷、低成本智慧医院室内地图应用解决方案

热门文章

  1. Spring Annotation知识梳理
  2. 高效代码之strcpy()实现
  3. dataguard备库的数据文件的迁移
  4. php中将SimpleXMLElement Object数组转化为普通数组
  5. 最长递增字串的三种做法
  6. 关于group by的用法 原理
  7. Golang之不可重入函数实现
  8. 20190730算法题存档
  9. light task schedule的定时任务实现源码解析
  10. 写出好代码系列 工程思维