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 ...
随机推荐
- target,currentTarget,delegateTarget,srcElement
第一种情况:就是IE9+和其他现代浏览器,支持addEventListener方法.其结果是: this总是等于currentTarget currentTarget总是事件监听者 target总是事 ...
- iOS开发UI篇——简单的浏览器查看程序
一.程序实现要求 1.要求 2. 界面分析 (1) 需要读取或修改属性的控件需要设置属性 序号标签 图片 图片描述 左边按钮 右边按钮 (2) 需要监听响应事件的对象,需要添加监听方法 左边按钮 右边 ...
- 《JavaScript高级程序设计》读书笔记
Javascript由以下三部分组成: 核心(ECMAScript) 文档对象模型(DOM) 浏览器对象模型(BOM) ECMAScript组成部分: 语法.类型.语句.关键字.保留子.操作符.对象. ...
- App Store自动下载WiFi与蜂窝数据切换机制
写下这个给自己备忘,上次也有一次载了个跟头. 在iOS 7和8里面,除了设置--App Store里面自动更新,自动下载,以及使用蜂窝数据要关之外,别以为用了WiFi挂着程序,就万无一失了. 这种情况 ...
- Spring MVC PageNotFound.noHandlerFound No mapping found for HTTP request with URI
首先骂人,干他娘的,弄了两个小时原来的包倒错了!!唉TMD. 注意用IDEA倒包的时候一定要注意ModelAndView是 原因是import出错了!!应该是import org.springfram ...
- MYSQL 存储过程1、SQL存储过程的基础知识
在深入理解MySq之前,我们先理下一些简单的问题 Q:什么是存储过程?(stored procedure) A:是一段写好的SQL代码,特别的就是它是存在数据库的目录里.所以外部程序可以直接调用数据库 ...
- Firefox--Date.parse()
比较两个时间字符串的时间大小用到了Date.parse()这个静态方法. 火狐下:Date.parse("2014-07-05 22:05:05") 返回的是NaN. 其它浏览器: ...
- layer弹出标签层tab
引入文件: <script type="text/javascript" src="layer/layer.min.js"></script& ...
- 大数据学习之hadoop伪分布式集群安装(一)公众号undefined110
hadoop的基本概念: Hadoop是一个由Apache基金会所开发的分布式系统基础架构. 用户可以在不了解分布式底层细节的情况下,开发分布式程序.充分利用集群的威力进行高速运算和存储. Hadoo ...
- Dapper中使用存储分页。
#region 分页获取数据 /// <summary> /// 分页获取数据 /// </summary> /// <typeparam name="T&qu ...