首先寫一個類,繼承CountDowmTimer
public class VerificationCountDownTimer extends CountDownTimer
01 構造函數(shù)
/**
* 類中的構造函數(shù)
* @param millisInFuture
* @param countDownInterval
*/
public VerificationCountDownTimer(long millisInFuture,long countDownInterval){
super(millisInFuture, countDownInterval);
}
- 兩個參數(shù)(均已毫秒為單位)
- millisInFuture 倒計的總時間
- countDownInterval 倒計的時間間隔
- 以 60s 的倒計時為例??伍茄,如下使用
verificationCountDownTimer = new VerificationCountDownTimer( 60*1000 , 1000)
02 方法
public final void cancel ()
public abstract void onFinish ()
public abstract void onTick (long millisUntilFinished)
public final CountDownTimer start ()
cancel() 取消當前任務
onFinish() 結束的時候調(diào)用
-
onTick(long millisUntilFinished) 當前任務每完成一次倒計時間間隔時調(diào)用栋盹,直接對UI進行更新
- 這個方法中的參數(shù)是在倒計時過程中傳入進來的毫秒數(shù),比如倒計時總時間為60秒敷矫,時間間隔為1秒例获,那么這個參數(shù)的傳進來的值依次為:59、58曹仗、57榨汤、56.....1
start() 開始當前任務
03 開發(fā)過程中的注意點(敲黑板!敲黑板T趺!)
手機發(fā)送驗證碼需要花費1條短信的費用0.10-0.15元才能獲取驗證碼收壕,平臺當然就希望盡可能多的省錢,所以開發(fā)端就需要設置驗證碼倒計時轨蛤,防止用戶出于有趣或者惡意一直在點擊獲取新驗證碼蜜宪,這樣就大大加重了平臺的運營負擔。所以加上驗證碼倒計時祥山,不僅能防止用戶心急戳戳戳圃验,或因網(wǎng)絡延遲而造成請求堆積,也能幫公司省點小錢缝呕。知道了使用原因澳窑,那就需要考慮一些特殊情形下的處理,比如:
- 當驗證碼進入倒計時供常,點擊后退摊聋,再重新進入有驗證碼的界面,驗證碼是重新start呢還是繼續(xù)處于前一個驗證碼倒計時狀態(tài)呢栈暇?
- 解決方法:設置一個檢測量栗精,利用 true 和 false 來進行判斷(在自己寫的類里面,先定義一個檢測量瞻鹏,然后在timerStart 內(nèi)部進行設置)
VerificationCountDownTimer.java
public class VerificationCountDownTimer extends CountDownTimer {
public static long curMillis =0;
public static boolean FLAG_FIRST_IN =true;
/**
* 類中的構造函數(shù)
* @param millisInFuture
* @param countDownInterval
*/
public VerificationCountDownTimer(long millisInFuture,long countDownInterval){
super(millisInFuture, countDownInterval);
}
/**
* 當前任務每完成一次倒計時間隔時間時回調(diào)
* @param millisUntilFinished
*/
@Override
public void onTick(long millisUntilFinished) {
}
/**
* 當前任務完成的時候回調(diào)
*/
@Override
public void onFinish() {
}
public void timerStart(boolean onClick){
if(onClick) {
VerificationCountDownTimer.curMillis= System.currentTimeMillis();
}
VerificationCountDownTimer.FLAG_FIRST_IN=false;
this.start();
}
}
一旦使用 timeeStart的時候悲立,就會將 檢測量設置為 false ,然然后在可以在 另一個Activity中 作為條件 進行判斷使用
RegisterActivity.java 關鍵部分(綁定按鈕的點擊事件)
- initCountDownTimer
- 如果滿足“不是第一次進入” 且 “倒計時時間不為0”的條件的話新博, 啟動 setCountDownTimer 方法薪夕,并將 檢測器 設置為false
衡量“倒計時時間是否為0”的方法
- 在點擊Button的時候,啟動的timerStart中赫悄,就將 curMillis 獲取為當前時間原献,所以判斷依據(jù)為:curMillis + 60000 ms 是否大于 當前時間
- 大于: 啟動 setCountDownTimer馏慨,setCountDownTimer內(nèi)置onTick方法,對獲取得到的剩余時間不斷的進行UI的展示
補充:system.currentTimeMillis() 獲得當前的時間
該方法的作用是返回當前的計算機時間姑隅,單位:毫秒写隶。之前使用new Date()來獲取當前時間,new Date()所做的事情其實就是調(diào)用了System.currentTimeMillis()讲仰。