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实现计时与倒计时(限时抢购)的几种方法的更多相关文章
- [转]Android实现计时与倒计时(限时抢购)的几种方法
在购物网站的促销活动中一般都有倒计时限制购物时间或者折扣的时间,这些都是如何实现的呢? 在一个安卓客户端项目中恰好遇到了类似的问题,一开始使用的是Timer与 TimerTask, 虽然此方法通用,但 ...
- 【Android】Eclipse自动编译NDK/JNI的三种方法
[Android]Eclipse自动编译NDK/JNI的三种方法 SkySeraph Sep. 18th 2014 Email:skyseraph00@163.com 更多精彩请直接访问SkySer ...
- android fragment传递参数_fragment之间传值的两种方法
在Activity中加载Fragment的时候.有时候要使用多个Fragment切换.并传值到另外一个Fragment.也就是说两个Fragment之间进行参数的传递.查了很多资料.找到两种方法.一种 ...
- Android中使用Gson解析JSON数据的两种方法
Json是一种类似于XML的通用数据交换格式,具有比XML更高的传输效率;本文将介绍两种方法解析JSON数据,需要的朋友可以参考下 Json是一种类似于XML的通用数据交换格式,具有比XML更高的 ...
- Android监听点击事件实现的三种方法
监听点击事件实现的三种方法:1.匿名内部类2.外部类3.直接实现接口 1.匿名内部类: package com.jereh.calculator; import android.content.Con ...
- Android实现 再按一次退出 的三种方法 durationTime、timerTask 和Handler
目前很多Android应用都会实现按返回键时提示“再按一次推退出” 在这篇文章中总结了各家的方法,一般都是监听Activity的onKeyDown 或者onBackPressed方法 方法一: 直接计 ...
- Android解析xml文件-采用DOM,PULL,SAX三种方法解析
解析如下xml文件 <?xml version="1.0" encoding="UTF-8"?> <persons> <perso ...
- android中完全退出当前应用程序的四种方法
Android程序有很多Activity,比如说主窗口A,调用了子窗口B,如果在B中直接finish(), 接下里显示的是A.在B中如何关闭整个Android应用程序呢?本人总结了几种比较简单的实现方 ...
- Windos下Android(ADT Bundle)配置NDK的两种方法------ADT、Cygwin、NDK配置汇总(转)
转自:http://blog.csdn.net/yanzi1225627/article/details/16897877 Android开发环境由windows下ADT Bundle搭建,且按前文h ...
随机推荐
- SQL 生成可配置流水号
需求背景每执行一次方法,根据公式返回最新的流水号.第一次使用时需要先插入一条数据,BizSeqValue 为流水起始号:A2014030000,Formula 为公式:A[yyyy][mm][c4], ...
- 【HAOI2011】向量
[题目描述] 给你一对数a,b,你可以任意使用(a,b), (a,-b), (-a,b), (-a,-b), (b,a), (b,-a), (-b,a), (-b,-a)这些向量,问你能不能拼出另一个 ...
- 【USACO 2.3.2】奶牛家谱
[题目描述] 农民约翰准备购买一群新奶牛.在这个新的奶牛群中,每一个母亲奶牛都生两小奶牛.这些奶牛间的关系可以用二叉树来表示.这些二叉树总共有N个节点(3 <= N < 200).这些二叉 ...
- javascript定义变量和优先级的问题
本文链接: javascript定义变量和优先级的问题.转载请保留. 看下面的代码: if (!("aa" in window)) { alert('oh my god'); ...
- MySQL Server 5.6 解压版安装配置
MySQL解压版下载地址为: http://dev.mysql.com/downloads/mysql/5.6.html#downloads 安装及配置步骤: ①将MySQL的zip包解压到路径C:\ ...
- Extjs中grid表格中去掉红三角
在编辑Extjs的gridpanel的时候,数据有错误或是修改在每个单元格上都会出现红色的小三角,在每个列上面可以配置allowBlank: false来标识这个不可以为空 有的时候在保存数据时如果不 ...
- websphere节点、单元、服务之间的关系
单元(cell).节点(node).概要文件(profile).服务(server) 在websphere集群(ND版本)模式下: 一个cell单元可以包含多个node节点,node=profile, ...
- window.clearInterval与window.setInterval的用法 定时器的设置
window.setInterval() 功能:按照指定的周期(以毫秒计)来调用函数或计算表达式. 语法:setInterval(code,millisec) code:在指定时间到时要执行的Java ...
- 深入理解javascript闭包(一)
原文转自脚本之家(http://www.jb51.net/article/24101.htm) 闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. ...
- 初学Javascript对象
<script> var p=new Object(); //属性 p.width=; p.height=; p.num=; p.autotime=; //方法 p.autoplay=fu ...