使用介紹
創(chuàng)新互聯(lián)主要從事網(wǎng)站建設、做網(wǎng)站、網(wǎng)頁設計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務。立足成都服務公主嶺,十多年網(wǎng)站建設經(jīng)驗,價格優(yōu)惠、服務專業(yè),歡迎來電咨詢建站服務:13518219792
開發(fā)中經(jīng)常會遇到一些和倒計時有關的場景,比如發(fā)送驗證碼的按鈕,會在點擊發(fā)送后,顯示倒計時間,倒計時結束后才能夠刷新按鈕,再次允許點擊。為了不阻塞軟件的運行,又要實時刷新界面,我們通常會用到 Handler 或者 AsyncTask 等技術,自己寫邏輯實現(xiàn)。其實 Android 中已經(jīng)封裝好了一套 CountDownTimer 來實現(xiàn)這個功能需求。
CountDownTimer(long millisInFuture, long countDownInterval)
CountDownTimer的兩個參數(shù)分別表示倒計時的總時間 millisInFuture和間隔時間 countDownInterval。
具體的調(diào)用如下:
TextView vertifyBtn; CountDownTimer timer = new CountDownTimer(60000, 1000) { @Override public void onTick(long millisUntilFinished) { vertifyBtn.setText((millisUntilFinished / 1000) + " second"); } @Override public void onFinish() { vertifyBtn.setEnabled(true); vertifyBtn.setText("Send"); } }; timer.start();
上面的調(diào)用舉例表示總計 60 秒,每 1 秒都會執(zhí)行一次 onTick 方法,其參數(shù) millisUntilFinished 表示倒計時剩余時間毫秒數(shù),最后倒計時結束執(zhí)行 onFinish 方法。
實現(xiàn)原理
下面是 CountDownTimer 的源碼,代碼非常少,很好理解。從源代碼中可以看出,其實 CountDownTimer 也是利用 Handler 的消息處理機制來實現(xiàn)效果的。初始化設定好起始和終止時間后,每隔一定的間隔時間通過 Handler 給主線程發(fā)送消息,然后再在消息處理中回調(diào)方法。好好利用官方封裝好的工具類,可以避免我們重復的造輪子,當然了解輪子的原理就更好了!
package android.os; 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; 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); } } } }; }
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。
名稱欄目:AndroidCountDownTimer實現(xiàn)倒計時器
文章地址:http://aaarwkj.com/article4/gjdgoe.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站、搜索引擎優(yōu)化、網(wǎng)站制作、面包屑導航、靜態(tài)網(wǎng)站、外貿(mào)網(wǎng)站建設
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)