CountDownTimer可用于提示作用,其用法较为简单,下面是文档中的一段用法:
new CountDownTimer(30000, 1000) {
public void onTick(long millisUntilFinished) {
mTextField.setText("seconds remaining: " + millisUntilFinished / 1000);
}
public void onFinish() {
mTextField.setText("done!");
}
}.start();
其作用是从30s开始以1s为间隔倒计时,并在每个间隔执行onTick方法(显示剩余时间),当倒计时完onFinish(显示“done”)。
此处注意一点是onTick的调用是同步的,即如果上次onTick没有执行完则本次不会调用,而是等下一次满足条件(下一个间隔onTick中已执行完毕)时再调用onTick方法。
举个例子:如果第一次进入onTick方法并执行一段耗时超过1s(间隔时间),假设耗时1.1s,则第二次进来不执行onTick方法,因为onTick同步,只能等上次的走完。所以两次调用的间隔为2s。
start():开始倒计时,每次调用都重新计时,会马上执行onTick()方法。
cancel():停止倒计时。
另外要提一下,我们虽设置为间隔时间1000,但实际情况可能会有一些误差。有可能执行一次后millisUntilFinished就是29001或者28999,这时就不能单纯地millisUntilFinished/1000获取剩余多少秒,得根据实际情况进行调整。
以下是测试代码:
private TextView mTvTime;
private Button mBtnStart,mBtnCancel;
private CountDownTimer mCounDownTimer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView() {
mTvTime = (TextView) findViewById(R.id.tv_time);
mBtnStart = (Button) findViewById(R.id.btn_start);
mBtnStart.setOnClickListener(this);
mBtnCancel = (Button) findViewById(R.id.btn_cancel);
mBtnCancel.setOnClickListener(this);
mCounDownTimer = new CountDownTimer(30000, 1000) {
@Override
public void onTick(long millisUntilFinished) {
Log.i("millisUntilFinished", "剩余时间:"+millisUntilFinished);
mTvTime.setText("剩余时间:"+millisUntilFinished/1000);
}
@Override
public void onFinish() {
mTvTime.setText("计时结束");
}
};
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_start:
mCounDownTimer.start();
break;
case R.id.btn_cancel:
mCounDownTimer.cancel();
break;
default:
break;
}
}