閱讀480 返回首頁    go 技術社區[雲棲]


Android 經典筆記之八:CountDownTimer解讀

目錄介紹

CountDownTimer(倒計時計數器)

  • 1.1 介紹
  • 1.2 參數
  • 1.3 公共方法
  • 1.4 使用方法
  • 1.5 源碼分析
  • 1.6 synchronized 關鍵字

0.本人寫的綜合案例
案例
說明及截圖
模塊:新聞,音樂,視頻,圖片,唐詩宋詞,快遞,天氣,記事本,閱讀器等等
接口:七牛,阿裏雲,天行,幹貨集中營,極速數據,追書神器等等

1.1介紹:
定時執行在一段時間後停止的倒計時,在倒計時執行過程中會在固定間隔時間得到通知。
1.2參數:
millisInFuture 從開始調用start()到倒計時完成並onFinish()方法被調用的毫秒數。(倒計時時間,單位毫秒)
countDownInterval 接收onTick(long)回調的間隔時間。(單位毫秒)
1.3公共方法

  • public final void cancel () 取消倒計時(取消後,再次啟動會重新開始倒計時)
  • public abstract void onFinish () 倒計時完成時被調用
  • public abstract void onTick (long millisUntilFinished) 固定間隔被調用
  • 參數 millisUntilFinished 倒計時剩餘時間。
  • public synchronized final CountDownTimer start () 啟動倒計時

1.4使用方法

CountDownTimer timer = new CountDownTimer(30000, 1000) {
    public void onTick(long millisUntilFinished) {

    }

    public void onFinish() {
        Intent intent = new Intent(GuideActivity.this, TimerReceiver.class);
        intent.setAction("timer");
    }
}.start();

源碼分析

  • 基本結構如下所示: CountDownTimer 這個類的基本結構(紅色標明的為關鍵處,藍色標明的為抽象函數,我們使用時必須進行實現)
    Image.png

  • 功能實現的關鍵部分在於 mHandler,下麵我們來看一看 mHandler 的源碼:

    // handles counting down
    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) {
                // no tick, just delay until done
                sendMessageDelayed(obtainMessage(MSG), millisLeft);
            } else {
                long lastTickStart = SystemClock.elapsedRealtime();
                onTick(millisLeft);
                // take into account user's onTick taking time to execute
                long delay = lastTickStart + mCountdownInterval - SystemClock.elapsedRealtime();
                // special case: user's onTick took more than interval to
                // complete, skip to next interval
                while (delay < 0) delay += mCountdownInterval;
                sendMessageDelayed(obtainMessage(MSG), delay);
            }
        }
    }
    };
    
  • 主要在處理對 millisLeft 剩餘時間的判斷,其中 delay 的處理需要注意,當 onTick() 方法耗時過長時會進行跳過,可以用如下的流程圖來表示整個流程:
    Image.png
    synchronized 關鍵字

  • 值得注意的是,源碼中 cancle(), start() 函數被 synchronized 修飾,*mHandler.handleMessage(Message msg)* 中代碼段也被 synchronized 修飾,它主要是用來保證在同一時刻,至多隻有一個線程執行該段代碼

  • 主要有以下兩個特點:

    • 當有一個線程訪問某具體對象的一個被 synchronized 修飾的代碼區域時,其它線程對該具體對象中所有被 synchronized 修飾的代碼區域的訪問都會被阻塞。
    • 當有一個線程訪問某具體對象的一個被 synchronized 修飾的代碼區域時,其它線程對該具體對象中沒有被 synchronized 修飾的代碼區域的訪問仍會正常進行。

其他說明

最後更新:2017-10-16 19:03:23

  上一篇:go  淺析:協同軟件已成為用戶應用軟件采購最大熱點?
  下一篇:go 馬雲看上盯盯拍,雲棲大會聯合搞事情