国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

Android CountDownTimer實現(xiàn)倒計時器

2019-12-12 03:36:40
字體:
供稿:網(wǎng)友

使用介紹

開發(fā)中經(jīng)常會遇到一些和倒計時有關(guān)的場景,比如發(fā)送驗證碼的按鈕,會在點擊發(fā)送后,顯示倒計時間,倒計時結(jié)束后才能夠刷新按鈕,再次允許點擊。為了不阻塞軟件的運行,又要實時刷新界面,我們通常會用到 Handler 或者 AsyncTask 等技術(shù),自己寫邏輯實現(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ù),最后倒計時結(jié)束執(zhí)行 onFinish 方法。

實現(xiàn)原理

下面是 CountDownTimer 的源碼,代碼非常少,很好理解。從源代碼中可以看出,其實 CountDownTimer 也是利用 Handler 的消息處理機制來實現(xiàn)效果的。初始化設(shè)定好起始和終止時間后,每隔一定的間隔時間通過 Handler 給主線程發(fā)送消息,然后再在消息處理中回調(diào)方法。好好利用官方封裝好的工具類,可以避免我們重復(fù)的造輪子,當然了解輪子的原理就更好了!

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)容,希望對大家的學習有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 通州市| 旬邑县| 启东市| 衢州市| 辉县市| 衡东县| 精河县| 安西县| 沭阳县| 万州区| 方山县| 万年县| 东乡县| 合江县| 九龙坡区| 马山县| 电白县| 枝江市| 芜湖市| 金沙县| 永胜县| 舞钢市| 阿克苏市| 昆山市| 临城县| 宁河县| 武乡县| 天气| 灵石县| 木里| 岐山县| 林州市| 新和县| 邻水| 池州市| 奉节县| 北碚区| 广水市| 龙里县| 桂林市| 新余市|