博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android倒计时案例展示
阅读量:6906 次
发布时间:2019-06-27

本文共 4250 字,大约阅读时间需要 14 分钟。

1. Handler 与Message方法实现倒计时功能 

关于Handler与Message消息机制的原理可查看:

这个设计思路也是最经常使用的一种设计 

比如: 当点击一个button触发事件,在事件中调用 handler的sendMessage的方法。那么在相应的handler的handleMessage中就会接收到这个消息。在这里里面再进行一些逻辑推断,再通过调用handler的 sendMessageDelayed这个延时发送消息的方法进行消息发送,同一时候更新相关的设置信息

/**	 * 使用handler 与 message方法实现倒计时功能	 */	/**	 * 倒计时总长	 */	long totalCount = 6000;	/**	 * 倒计时时间间隔	 */	long flag = 1000;	private void startCountDown4() {		Message msg = Message.obtain();		msg.what = 001;		mhHandler.sendMessage(msg);	}	private Handler mhHandler = new Handler() {		public void handleMessage(android.os.Message msg) {			if (msg.what == 001) {				if (totalCount > 0) {					/**					 * 发送延迟1秒的消息					 */					Message msg1 = Message.obtain();					msg1.what = 001;					mhHandler.sendMessageDelayed(msg1, flag);					/**					 * 更新显示UI					 */					textview.setText(totalCount / 1000 + "秒");					/**					 * 更新倒计时总时间					 */					totalCount -= flag;				}			}		};	};

2 使用Handler的post与Runnable结合实现倒计时功能 

运行handler.post();方法,方法中传入一个runnable实例对象。会运行 这个实例对象的run方法。在run方法中再进行想着逻辑的推断。然后调用handler.postDelayed方法实例延迟运行相关操作的方法,这里是运行了相同的操作。从而达到实现一个倒计时的功能

/**	 * 使用handler的post方法与 runnable结合 实现倒计时的功能	 */	/**	 * 倒计时总长	 */	long totalCount = 6000;	/**	 * 倒计时时间间隔	 */	long flag = 1000;	public Handler handler = new Handler();	public Runnable countDownRunn = new Runnable() {		@Override		public void run() {			if (totalCount > 0) {				handler.postDelayed(countDownRunn, flag);				totalCount -= flag;				textview.setText(totalCount / 1000 + "秒");			}		}	};	public void startCountDown3() {		handler.post(countDownRunn);	}

3  使用子线程来实现倒计时

这里通过开启一个子线程,在线程中开启一个while循环,在这个循环中通过调用方法 seytemClock.sleep(time) 使用这个线程堵塞time时间,然后再进行相关的设置,从而达到倒计时的效果

/**	 * 倒计时总长	 */	long totalCount = 6000;	/**	 * 倒计时时间间隔	 */	long flag = 1000;	/**	 * 使用子线程实现倒计时的功能	 */	public void startCountDown2() {		new Thread() {			public void run() {				while (totalCount > 0) {					/**					 * 设置每隔flag时间间隔运行一次					 */					SystemClock.sleep(flag);					/**					 * 更新页面显示时间					 */					MainActivity.this.runOnUiThread(new Runnable() {						@Override						public void run() {							textview.setText(totalCount / 1000 + "秒");						}					});					totalCount -= flag;				}			};		}.start();	}

4 使用CountDownTimer类来实现倒计时功能 

相对来说使用这个类的设计逻辑比較简单

/**	 * 使用CountDownTimer 类实现倒计时功能	 */	public void startCountDown() {		TimeCount timeCount = new TimeCount(60000, 1000);		timeCount.start();	}	public class TimeCount extends CountDownTimer {		/**		 * 		 * @param millisInFuture		 *            总倒计时时长 单位毫秒		 * @param countDownInterval		 *            倒计时时间间隔 单位毫秒		 */		public TimeCount(long millisInFuture, long countDownInterval) {			super(millisInFuture, countDownInterval);		}		@Override		public void onTick(long l) {			textview.setText(l / 1000 + "秒");		}		@Override		public void onFinish() {		}	}

5 使用属性动画的方式来实现倒计时 

/**	 * 使用属性动画的方式来实现	 * 	 */	int totalNumber = 6000;	private void startCountDown5(){		final ValueAnimator animator = ValueAnimator.ofInt(0,totalNumber/1000);        animator.setDuration(totalNumber);        animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {            @Override            public void onAnimationUpdate(ValueAnimator animation) {                Integer value = (Integer) animation.getAnimatedValue();                /**                 * value 这里获取到的是递增获取到的时间 单位为秒                 *                  */                textview.setText((totalCount-value*1000)/1000+"秒");                if (value*1000>(totalCount-1000)) {					animator.cancel();				}            }        });        animator.start();			}
这样的方式实现的效果可能会不佳,只是也不失为一种思路,在使用的时候能够调整ValueAnimator.ofInt()中第二个參数的计算參数

6 .使用 Timer 与TimerTask方式实现

Timer mSignTimer = new Timer();		mSignTimer.schedule(new TimerTask() {			@Override			public void run() {				mCurrentTime += 1000;				getActivity().runOnUiThread(						new Runnable() {							public void run() {								mSignDateTextView.setText(DataUtils										.getDateYear(mCurrentTime) + "");															}						});			}		}, 0, 1000);

这里用schedule方法。第一个參数是TimerTask对象,第二个參数表示開始运行前的延时时间(单位是milliseconds。这里定义了0),第三个參数是表示定时运行时间(单位是milliseconds,这里定义了1000)

这里使用的mCurrentTime是系统当前的时间 ,设置schedule的第三个參数为1000,也就是每1秒运行一下这种方法,那么每次运行加1000毫秒。从而实现了计时功能,当然这里使用的不是倒计时的功能。加一些逻辑推断是能够实现倒计时功能的

这里是直接调用Context对象的runOnUiThread方法。在主线程中进行更新Ui上的显示效果

源代码: 

转载地址:http://ddgdl.baihongyu.com/

你可能感兴趣的文章
c的按位取反运算符(~) 与逻辑逻辑(!)
查看>>
linux 内核移植和根文件系统的制作
查看>>
Windows Azure Storage (2) Windows Azure Storage Service存储服务之Blob详解(上)
查看>>
观察者模式
查看>>
sql分页
查看>>
单机程序的数据处理:Access + DataSet + Linq
查看>>
Asp.net 通过Repeater嵌套Repeater循环添加对应的一组控件
查看>>
iPhone开发之UISearchBar学习
查看>>
extern "C"用法详解
查看>>
齐次坐标
查看>>
Java将数字字符串转换成中文形式
查看>>
ASP.NET性能优化之反向代理缓存
查看>>
源码方式在ubuntu系统上安装ruby1.9.2
查看>>
6 套多点触摸屏的手势图标集
查看>>
解决.svc 无法解析
查看>>
android post 提交数据
查看>>
CDN技术详解
查看>>
mysql 学习笔记
查看>>
简说宽带商的弹窗广告进化及网站应对之策(DNS劫持进化论)
查看>>
Ajax请求过程中显示“进度”的简单实现
查看>>