android开发过程存在一些场景需要使用到倒计时,最近遇到一个简单的功能便是,按钮在点击后的一分钟中内不允许点击,一分钟后就可以了。其实实现起来还是很简单的,实现方式也有很多。这里主要说一下,利用android提供的CountDownTimer类来实现简单的倒计时功能,先简单看一下效果图吧:
废话不多说,直接看下代码,如下:
public class MainActivity extends AppCompatActivity {
private TextView mTvTime;
private CountDownTimer mCountDownTimer;
private int num = 60; //倒计时总时长
private boolean isStart =true;
private Button mBtnStart;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//防止回到桌面后再点击应用图标后再重启应用,当然也可以设置启动模式为singleTask
if((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0){
finish();
return;
}
setContentView(R.layout.activity_main);
initView();
Log.e("zxh","onCreate==");
}
private void initView() {
mTvTime = (TextView) findViewById(R.id.tv_time);
mBtnStart = (Button) findViewById(R.id.btn_start);
}
private void initData() {
//初始化倒计时类,第一个参数为总的倒计时时长,第二个为间隔时长
mCountDownTimer = new CountDownTimer((num+ 2)*1000, 1000) { //加2是为了倒计时能显示到0
@Override
public void onTick(long millisUntilFinished) { //每隔相应间隔时间回调一次
mTvTime.setText(num + "");
Log.e("zxh","num==" + num);
if (num==0){
mBtnStart.setText("重新开始");
isStart = true;
num=60;
}else {
num--;
}
}
@Override
public void onFinish() { //倒计时结束的回调
Log.e("zxh","倒计时结束了...num==" + num);
}
};
}
/**
* 开始倒计时
* @param view
*/
public void start(View view){
if (isStart){ //如果是开始状态点击开始计时,文字变为暂停
mBtnStart.setText("暂停");
Log.e("zxh","点击开始。。num==" + num);
initData();
mCountDownTimer.start();
isStart = false;
}else{ //暂停状态点击则停止计算,文字变为开始
mCountDownTimer.cancel();
mBtnStart.setText("开始");
num++; //停止计算的时候要将数据+1,因为onTick回调函数已-1了
isStart = true;
}
}
/**
* 重新倒计时
* @param view
*/
public void replay(View view){
if (mCountDownTimer != null){
mCountDownTimer.cancel();
num= 60;
initData();
mCountDownTimer.start();
mBtnStart.setText("暂停");
isStart = false;
}
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.e("zxh","onDestroy==mCountDownTimer==" + mCountDownTimer);
//因为CountDownTimer是在后台开启了一个线程,为了减少消耗,退出时取消倒计时。
if (mCountDownTimer != null){
mCountDownTimer.cancel();
}
}
}
这里要注意几点:
1.CountDownTimer这个类会开启一个后台线程去倒计时,如果不cancel掉,会一直到后台倒计时,直到结束;
2.点击计时开始、暂停、重新时,简单逻辑的处理需要理清,具体看代码里注释。