實現(xiàn)倒計時的方式真是多種多樣炕吸,今天作為小白的我就總結(jié)一下 缎罢,如有雷同,哈哈哈骑素。袋哼。冀墨。
方式一 Handler.sendEmptyMessageDelayed
int time = 10 ;
int RepeatCount = 10;
private Handler handler =new Handler(){
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case 1://倒計時
time = time - 1;
if (time <= 0) {
time = RepeatCount ;
Log.e("tag" ,"結(jié)束 "+ StringFormat.dateFormathmm(new Date()) ) ;
} else {
Log.e("tag" ,"當前時間"+ StringFormat.dateFormathmm(new Date()) +" time " + String.valueOf(time)) ; handler.sendEmptyMessageDelayed(1, 1000);
}
break;
default:
break;
}
};
};
調(diào)用 方式如下
handler.sendEmptyMessage(1);//通知倒計時
方式二 CountDownTimer
Android 封裝好的 先嬉,比較簡單
private CountDownTimer countDownTimer = new CountDownTimer(10000, 1000) {//第一個參數(shù)表示總時間,第二個參數(shù)表示間隔時間楚堤。
@Override
public void onTick(long millisUntilFinished) {
Log.e("tag", "當前時間" + StringFormat.dateFormathmm(new Date()) + " timer " + (millisUntilFinished / 1000));
}
@Override
public void onFinish() {
Log.e("tag", "結(jié)束");
}
};
調(diào)用也比較簡單
countDownTimer.start();
方式三 Timer + TimerTask + Handler
int time = 10 疫蔓;
Timer timer;
private Handler handler = new Handler(){
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case 1:
if(time>0){
Log.e("tag" ,"當前時間"+ StringFormat.dateFormathmm(new Date()) +" timer " + String.valueOf(time)) ;
}else{
timer.cancel();
Log.e("tag" ,"結(jié)束 "+ StringFormat.dateFormathmm(new Date()) ) ;
}
break;
default:
break;
}
};
};
timer=new Timer();
TimerTask task = new TimerTask() {
@Override
public void run(){
time--;
handler.sendEmptyMessage(1);
}
};
timer.schedule(task, 100, 1000);
方式四 ValueAnimator
也是相當容易。身冬。衅胀。soso .
valueAnimator = ValueAnimator.ofInt(10, 0);
valueAnimator.setDuration(10 * 1000);// 注意 單位
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
Integer timer = (Integer) animation.getAnimatedValue();
if (value == 0) {
Log.e("tag", "結(jié)束");
} else {
Log.e("tag" ,"當前時間"+ StringFormat.dateFormathmm(new Date()) +" timer " + String.valueOf(timer)) ;
}
}
});
valueAnimator.start();
方式五 Observable.timer + repeat
Observable.timer(1, TimeUnit.SECONDS)
.subscribeOn(Schedulers.computation())
.observeOn(AndroidSchedulers.mainThread())
.repeat(count)
.subscribe(aLong ->
{
timer--;//aLong 0
Log.e("tag" ,"當前時間"+ StringFormat.dateFormathmm(new Date()) +" timer " + String.valueOf(timer)) ;
if (timer<=0){
timer = count;
Log.e("tag" ," 結(jié)束 " ) ;
}
});
方式六 Observable.interval
Observable.interval(0, 1, TimeUnit.SECONDS)//設(shè)置0延遲,每隔一秒發(fā)送一條數(shù)據(jù)
.doOnSubscribe(new Action0() {
@Override
public void call() {
Log.e("tag","開始");
})
.subscribeOn(AndroidSchedulers.mainThread()) // 上面 指定主線程
.map(new Func1<Long, Long>() {
@Override
public Long call(Long aLong) {
return count - aLong; // 將 1,2酥筝,3 滚躯。。 轉(zhuǎn)成 3,2,1 。掸掏。
}
})
.take(count + 1) //設(shè)置循環(huán)count +1次
.observeOn(AndroidSchedulers.mainThread()) //回調(diào)到主線程
.subscribe(new Observer<Long>() {
@Override
public void onCompleted() {
Log.e("tag" ," 結(jié)束 " ) ;
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Long aLong) {
Log.e(TAG, "當前時間"+ StringFormat.dateFormathmm(new Date()) +"onNext:剩余時間 " + aLong);
}
});
注意:
在當前頁面銷毀時茁影,注意當前的計時器是否還在繼續(xù),如有正運行的計時器 丧凤,一定要 手動 取消募闲,或者 置 空,以免造成泄露和錯誤愿待。