Android demo倒计时原理(CountDownTimer原理)

项目中用绑定手机号功能,发送之后2分钟倒计时。
倒计时的功能用到了CountDownTimer类,这是android的一个工具类。很巧妙

下面是这个类的原理解析,此类比较简单。但很强大。


package com.example.democountdowntheory;

import android.os.Handler;
import android.os.Message;
import android.os.SystemClock;

public abstract class MyCountDownTimer {
	/*原理:
	 * 随时用SystemClock.elapsedRealtime()获取时间,使用这个时间来精确倒计时的数值
	 * 其他比较简单看看就明白了
	 * */
	
	private static final int MSG = 1;
	private long mSetTotalTime;// 总的时间120000,120秒
	private long mSetDownValue;// 减少的值1000,1秒

	public MyCountDownTimer(long totalTime, long downValue) {
		this.mSetTotalTime = totalTime;
		this.mSetDownValue = downValue;
	}

	/**
	 * 启动
	 */
	public final synchronized MyCountDownTimer  start() {
		if (mSetTotalTime <= 0) {
			onFinish();
			return this;
		}

		mStartTime = SystemClock.elapsedRealtime() + mSetTotalTime;// 开始的时间+开机到现在的时间
		mHandler.sendMessage(mHandler.obtainMessage(MSG));
		return this;

	};

	/**
	 * 变化的值
	 */
	public abstract void onTick(long remain);

	public void cancel() {
		mHandler.removeMessages(MSG);
	}

	/**
	 * 结束之后
	 */
	public abstract void onFinish();

	private Handler mHandler = new Handler() {
		public void handleMessage(Message msg) {
			synchronized (MyCountDownTimer.this) {

				long remain = mStartTime - SystemClock.elapsedRealtime();// 减少后,剩余的时间。
				if (remain <= 0) {
					onFinish();// 完成
				} else if (mSetTotalTime < mSetDownValue) {
					// 设置的值<down减少的值
					sendMessageDelayed(obtainMessage(MSG), remain);
				} else {
					// 减少操作
					long pre = SystemClock.elapsedRealtime();
					onTick(remain);// 将值回调,供用户使用
					long delay = pre + mSetDownValue
							- SystemClock.elapsedRealtime();
					while (delay < 0) {
						delay += mSetDownValue;
					}
					sendMessageDelayed(obtainMessage(MSG), delay);
				}
			}
		};

	};
	private long mStartTime;

}
Android demo倒计时原理(CountDownTimer原理)_第1张图片
demo地址:http://download.csdn.net/detail/pangzaifei/7006651

你可能感兴趣的:(android,CountDownTimer)