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

原博客的链接:http://blog.csdn.net/pangzaifei/article/details/20723661

 

项目中用绑定手机号功能,发送之后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 long mStartTime;
    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);  
                }  
            }  
        };  
  
    };  
     
  
}  

根据以上博主的博客,我写了一个demo验证

demo下载:Android倒计时Demo


你可能感兴趣的:(Android开发,android平台)