標籤: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分析