说道计时器,可能是因为从java出门的。所以一直使用的都是java的timer类以及配套的timertask类,今天逛逛博客,看到了 CountDownTimer
这个类,照例搜索了一番,然发现他是Android封装好的一个计时的类,既然人家都封好了,使用起来肯定比timer的使用还要简单。所以做了一个简单的demo。,发现特别简单,接下来上他的用法
TextView textView;
CountDownTimer countdowntimer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView=(TextView) this.findViewById(R.id.textView1);
countdowntimer=new CountDownTimer(10000,1000) {
@Override
public void onTick(long millisUntilFinished) {
textView.setText(millisUntilFinished+"");
}
@Override
public void onFinish() {
textView.setText("finish");
}
};
countdowntimer.start();
}
}
代码比较简单,其中的参数
第一个为总时间,比如3000,,
第二个 间隔时间,比如1000
然后开始看看源码。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
public CountDownTimer(long millisInFuture, long countDownInterval) {
mMillisInFuture = millisInFuture;
mCountdownInterval = countDownInterval;
}
这个就是构造方法了,比较简单,而且他也只有这个构造方法
public synchronized final void cancel() {
mCancelled = true;
mHandler.removeMessages(MSG);
}
然后再这个cancel类中可以看到他是通过handler去操作的,好吧,凡事离不开handler
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) {
sendMessageDelayed(obtainMessage(MSG), millisLeft);
} else {
long lastTickStart = SystemClock.elapsedRealtime();
onTick(millisLeft);
long delay = lastTickStart + mCountdownInterval - SystemClock.elapsedRealtime();
while (delay < 0) delay += mCountdownInterval;
sendMessageDelayed(obtainMessage(MSG), delay);
}
}
}
};
这个是handler里的操作,看得出来。
1。必须是锁定的,这样就不会照成混乱。
2.对long型数据的操作,然后就没没了,所以还是很简单的,
对了,最后提醒,要启动时既得是用start方法