480
技術社區[雲棲]
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 這個類的基本結構(紅色標明的為關鍵處,藍色標明的為抽象函數,我們使用時必須進行實現)
-
功能實現的關鍵部分在於 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() 方法耗時過長時會進行跳過,可以用如下的流程圖來表示整個流程:
synchronized 關鍵字值得注意的是,源碼中 cancle(), start() 函數被 synchronized 修飾,*mHandler.handleMessage(Message msg)* 中代碼段也被 synchronized 修飾,它主要是用來保證在同一時刻,至多隻有一個線程執行該段代碼
-
主要有以下兩個特點:
- 當有一個線程訪問某具體對象的一個被 synchronized 修飾的代碼區域時,其它線程對該具體對象中所有被 synchronized 修飾的代碼區域的訪問都會被阻塞。
- 當有一個線程訪問某具體對象的一個被 synchronized 修飾的代碼區域時,其它線程對該具體對象中沒有被 synchronized 修飾的代碼區域的訪問仍會正常進行。
其他說明
- 知乎:https://www.zhihu.com/people/yang-chong-69-24/pins/posts
- 領英:https://www.linkedin.com/in/chong-yang-049216146/
- 簡書:https://www.jianshu.com/u/b7b2c6ed9284
- csdn:https://my.csdn.net/m0_37700275
- 網易博客:https://yangchong211.blog.163.com/
- 新浪博客:https://blog.sina.com.cn/786041010yc
- github:https://github.com/yangchong211
- 喜馬拉雅聽書:https://www.ximalaya.com/zhubo/71989305/
- 脈脈:yc930211
- 360圖書館:https://www.360doc.com/myfiles.aspx
- 開源中國:https://my.oschina.net/zbj1618/blog
- 泡在網上的日子:https://www.jcodecraeer.com/member/content_list.php?channelid=1
- 郵箱:yangchong211@163.com
- 阿裏雲博客:https://yq.aliyun.com/users/article?spm=5176.100239.headeruserinfo.3.dT4bcV
最後更新:2017-10-16 19:03:23
上一篇:
淺析:協同軟件已成為用戶應用軟件采購最大熱點?
下一篇:
馬雲看上盯盯拍,雲棲大會聯合搞事情
現代應用架構中的配置管理麵臨的挑戰和應對之道
2017杭州雲棲大會,.xin重磅發布一鍵查詢企業信用
9月26日雲棲精選夜讀:阿裏Java代碼規約插件即將全球首發,邀您來發布儀式現場
android塗鴉實現
《數據結構與抽象:Java語言描述(原書第4版)》一JI1.1 泛型數據類型
四甲基二苯基三矽氧烷和苯基含氫矽油
《Groovy官方指南》目錄
阿裏雲獲“國家安全標準應用案例評選”最高獎,“政府上雲”成合規示範方案
Java程序員也應該知道的係統知識係列之網卡
Android中安裝軟件到模擬器時提示:INSTALL_FAILED_INSUFFICIENT_STORAGE 解決辦法