Android实现计时与倒计时(限时抢购)的几种方法
16lz
2022-04-26
Android实现计时与倒计时(限时抢购)的几种方法
标签:Android 2013-12-03 10:40 1961人阅读 评论(0) 收藏 举报 分类: 【Android开发学习之路】(118)Android实现计时与倒计时(限时抢购)的几种方法
在购物网站的促销活动中一般都有倒计时限制购物时间或者折扣的时间,这些都是如何实现的呢?
在一个安卓客户端项目中恰好遇到了类似的问题,一开始使用的是Timer与 TimerTask, 虽然此方法通用,但后来考虑在安卓中是否有更佳的方案,于是乎共找到以下五种实现方案,另外还有一种使用CountDownTimer进行计时的方面,我会在单独的文章中进行介绍
效果如图:
方法一
Timer与TimerTask(Java实现)[java]view plaincopy
- publicclasstimerTaskextendsActivity{
- privateintrecLen=11;
- privateTextViewtxtView;
- Timertimer=newTimer();
- publicvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.timertask);
- txtView=(TextView)findViewById(R.id.txttime);
- timer.schedule(task,1000,1000);//timeTask
- }
- TimerTasktask=newTimerTask(){
- @Override
- publicvoidrun(){
- runOnUiThread(newRunnable(){//UIthread
- @Override
- publicvoidrun(){
- recLen--;
- txtView.setText(""+recLen);
- if(recLen<0){
- timer.cancel();
- txtView.setVisibility(View.GONE);
- }
- }
- });
- }
- };
- }
方法二
TimerTask与Handler(不用Timer的改进型)
[java]view plaincopy
- publicclasstimerTaskextendsActivity{
- privateintrecLen=11;
- privateTextViewtxtView;
- Timertimer=newTimer();
- publicvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.timertask);
- txtView=(TextView)findViewById(R.id.txttime);
- timer.schedule(task,1000,1000);//timeTask
- }
- finalHandlerhandler=newHandler(){
- @Override
- publicvoidhandleMessage(Messagemsg){
- switch(msg.what){
- case1:
- txtView.setText(""+recLen);
- if(recLen<0){
- timer.cancel();
- txtView.setVisibility(View.GONE);
- }
- }
- }
- };
- TimerTasktask=newTimerTask(){
- @Override
- publicvoidrun(){
- recLen--;
- Messagemessage=newMessage();
- message.what=1;
- handler.sendMessage(message);
- }
- };
- }
方法三
[java]view plaincopy
- Handler与Message(不用TimerTask)
- publicclasstimerTaskextendsActivity{
- privateintrecLen=11;
- privateTextViewtxtView;
- publicvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.timertask);
- txtView=(TextView)findViewById(R.id.txttime);
- Messagemessage=handler.obtainMessage(1);//Message
- handler.sendMessageDelayed(message,1000);
- }
- finalHandlerhandler=newHandler(){
- publicvoidhandleMessage(Messagemsg){//handlemessage
- switch(msg.what){
- case1:
- recLen--;
- txtView.setText(""+recLen);
- if(recLen>0){
- Messagemessage=handler.obtainMessage(1);
- handler.sendMessageDelayed(message,1000);//sendmessage
- }else{
- txtView.setVisibility(View.GONE);
- }
- }
- super.handleMessage(msg);
- }
- };
- }
方法四
Handler与Thread(不占用UI线程)
[java]view plaincopy
- publicclasstimerTaskextendsActivity{
- privateintrecLen=0;
- privateTextViewtxtView;
- publicvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.timertask);
- txtView=(TextView)findViewById(R.id.txttime);
- newThread(newMyThread()).start();//startthread
- }
- finalHandlerhandler=newHandler(){//handle
- publicvoidhandleMessage(Messagemsg){
- switch(msg.what){
- case1:
- recLen++;
- txtView.setText(""+recLen);
- }
- super.handleMessage(msg);
- }
- };
- publicclassMyThreadimplementsRunnable{//thread
- @Override
- publicvoidrun(){
- while(true){
- try{
- Thread.sleep(1000);//sleep1000ms
- Messagemessage=newMessage();
- message.what=1;
- handler.sendMessage(message);
- }catch(Exceptione){
- }
方法五
[java]view plaincopy
- Handler与Runnable(最简单型)
- publicclasstimerTaskextendsActivity{
- privateintrecLen=0;
- privateTextViewtxtView;
- publicvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.timertask);
- txtView=(TextView)findViewById(R.id.txttime);
- runnable.run();
- }
- Handlerhandler=newHandler();
- Runnablerunnable=newRunnable(){
- @Override
- publicvoidrun(){
- 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,另起线程单独用于计时和其它的逻辑处理
更多相关文章
- Chronometer android计时器组件Chronometer的使用,android通话时
- [转]Android的Handler总结
- Android应用程序的完全退出
- 进度圈的显示
- Android(安卓)Handler机制简单分析
- Android(安卓)Graphics专题(1)--- Canvas基础
- Android(安卓)View measure流程详解
- 浅谈Java中Collections.sort对List排序的两种方法
- Python list sort方法的具体使用