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

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

在一个安卓客户端项目中恰好遇到了类似的问题,一开始使用的是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自定义DigitalClock控件实现商品倒计时
  • Android定时器和倒计时实现淘宝秒杀功能
  • Android CountDownTimer实现定时器和倒计时效果
  • android自定义倒计时控件示例
  • android实现倒计时功能代码
  • Android实现计时与倒计时的常用方法小结
  • Android实现加载广告图片和倒计时的开屏布局
  • Android 实现闪屏页和右上角的倒计时跳转实例代码
  • Andorid实现精确到天时分秒的抢购倒计时
(0)

相关推荐

  • Android 实现闪屏页和右上角的倒计时跳转实例代码

    以前编程的时候,遇到倒计时的功能时,经常自己去写,但其实Android已经帮封装好了一个倒计时类CountDownTimer,其实是将后台线程的创建和Handler队列封装成为了一个方便的类调用. 闪屏页用到了handler和CountDownTimer类,还需配置一下Activity的主题,这里是:android:theme="@android:style/Theme.NoTitleBar.Fullscreen" 全屏主题的意思. 给大家展示下效果图: 代码如下所示: package

  • Android仿活动时分秒倒计时效果

    本文实例为大家分享了Android时分秒倒计时效果的具体代码,供大家参考,具体内容如下 从mian.xml下手: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:l

  • Android实现加载广告图片和倒计时的开屏布局

    这是一个android开屏布局的实例,可以用于加载广告图片和倒计时的布局.程序中设置的LayoutParams,划分额外空间比例为6分之5,具体权重比例可根据用户自己需求来自定义,异步加载广告图片,相关的Android代码. 具体实现代码如下: package cn.waps.extend; import android.app.Activity; import android.content.Context; import android.content.res.Configuration;

  • Android CountDownTimer实现定时器和倒计时效果

    本文实例为大家分享了Android实现定时器和倒计时的具体代码,供大家参考,具体内容如下 直接上代码,相信都看得懂. Android已经帮封装好了一个类,只不过很多人不知道而已. 代码: public class SplashActivity extends BaseAppCompatActivity { @InjectView(R.id.ivBg) ImageView ivBg; @InjectView(R.id.tvSkip) TextView tvSkip; int[] imgs = ne

  • Android定时器和倒计时实现淘宝秒杀功能

    本文实例为大家分享了Android实现淘宝秒杀的具体代码,供大家参考,具体内容如下 目录结构 效果图: imageViewHolder public class imageViewHolder extends RecyclerView.ViewHolder { public ImageView imageView; public imageViewHolder(View itemView) { super(itemView); imageView = (ImageView) itemView;

  • android自定义倒计时控件示例

    自定义TextView控件TimeTextView代码: 复制代码 代码如下: import android.content.Context;import android.content.res.TypedArray;import android.graphics.Paint;import android.text.Html;import android.util.AttributeSet;import android.widget.TextView; import com.new0315.R;

  • Android实现计时与倒计时的常用方法小结

    本文实例总结了Android实现计时与倒计时的常用方法.分享给大家供大家参考,具体如下: 方法一 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.onC

  • android实现倒计时功能代码

    效果图,每隔1秒,变换一下时间  xml: 复制代码 代码如下: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="mat

  • Android自定义DigitalClock控件实现商品倒计时

    本文实例为大家分享了DigitalClock实现商品倒计时的具体代码,供大家参考,具体内容如下 自定义DigitalClock控件: package com.veally.timesale; import java.util.Calendar; import android.content.Context; import android.database.ContentObserver; import android.os.Handler; import android.os.SystemClo

  • Andorid实现精确到天时分秒的抢购倒计时

    今天项目用到了抢购时倒计时的功能 ,今天找了好多哥们,也百度了好多,但是没有自己喜欢并且能消化的.好不容易找到了一个能容易看懂的,然而又不符合我想要的需求,所以自己搞一下.不知道是否简单,但是最起码是项目的功能可以实现.(一下午,没白费.开心) 直接上代码好了,我相信都能看懂.我除外.(我搞了一下午)哎.反正现在懂点了... package com.qust.widght; import java.text.SimpleDateFormat; import java.util.Date; imp

随机推荐