android中倒計時控制項CountDownTimer分析

來源:互聯網
上載者:User

標籤:his   syn   tar   str   util   delay   sys   pre   mst   

android中倒計時控制項CountDownTimer分析1 範例程式碼new CountDownTimer(10000, 1000) {    public void onTick(long millisUntilFinished) {        LogUtil.i(TAG, "seconds remaining: " + millisUntilFinished / 1000);    }    public void onFinish() {        LogUtil.i(TAG, "done!");    }}.start();2 API解析CountDownTimer (long millisInFuture, long countDownInterval)millisInFuture: 你要倒計時的總時間, 單位ms.countDownInterval: 你要倒計時的間隔時間, 單位ms.public final void cancel () //取消當前的任務public abstract void onFinish () //當前任務完成的時候回調public abstract void onTick (long millisUntilFinished) //當前任務每完成一次倒計時間隔時間時回調public final CountDownTimer start () //開始當前的任務3 源碼分析public abstract class CountDownTimer {    private final long mMillisInFuture; //倒計時的總時間    private final long mCountdownInterval; //倒計時的間隔時間    private long mStopTimeInFuture;    private boolean mCancelled = false; //是否取消計時任務    //構造方法    public CountDownTimer(long millisInFuture, long countDownInterval) {        mMillisInFuture = millisInFuture;        mCountdownInterval = countDownInterval;    }    //取消倒計時    public synchronized final void cancel() {        mCancelled = true;        mHandler.removeMessages(MSG);    }    //開始倒計時    public synchronized final CountDownTimer start() {        mCancelled = false;        if (mMillisInFuture <= 0) {            onFinish();            return this;        }        mStopTimeInFuture = SystemClock.elapsedRealtime() + mMillisInFuture;        mHandler.sendMessage(mHandler.obtainMessage(MSG));        return this;    }    //定期會回調的方法    public abstract void onTick(long millisUntilFinished);    //計時結束的回調方法    public abstract void onFinish();    private static final int MSG = 1;    //CountDownTimer採用的是handler機制,通過sendMessageDelayed延遲發送一條message到主線程的looper中,    //然後在自身中收到之後判斷剩餘時間,並發出相關回調,然後再次發出message的方式。    //取消倒計時,把任務從對MessageQueue中移除就好了。    private Handler mHandler = new Handler() {        @Override        public void handleMessage(Message msg) {            synchronized (CountDownTimer.this) {                if (mCancelled) {                    return;                }                final long millisLeft = mStopTimeInFuture - SystemClock.elapsedRealtime(); //剩餘時間                if (millisLeft <= 0) {                    onFinish();                } else if (millisLeft < mCountdownInterval) {                    sendMessageDelayed(obtainMessage(MSG), millisLeft);                } else {                    long lastTickStart = SystemClock.elapsedRealtime();                    onTick(millisLeft);                    long delay = lastTickStart + mCountdownInterval - SystemClock.elapsedRealtime();                    while (delay < 0) delay += mCountdownInterval;                    sendMessageDelayed(obtainMessage(MSG), delay);                }            }        }    };}4 幾點注意1 elapsedRealtime currentTimeMillis()區別System.currentTimeMillis()擷取的是系統時間,是距離1970年1月1日開始計算的一個值;android.os.SystemClock.elapsedRealtime()擷取從裝置boot後經曆的時間值。System.currentTimeMillis()擷取當前日期有意義,如當前是xxxx年xx月xx時xx分xx秒xxx毫秒,這個值在系統設定中可以更改的;而SystemClock.elapsedRealtime()計算某個時間經曆了多長時間有意義,例如通話經曆了多長時間,這個值是系統設定無關。但是Android源碼中計算通話時間是用System.currentTimeMillis()的,這個一般情況下是沒有問題的。但是如果有人在裝置建立通話後修改系統時間,那麼通話結束後的時間值就不對了,日期往後調整個幾年,通話時間就會顯示有幾年的2 sendMessageDelayed()boolean sendEmptyMessageDelayed (int what,  long delayMillis)在特定的時間delayMillis流逝後 發送一個僅包含有what的訊息

 

android中倒計時控制項CountDownTimer分析

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.