您的位置:首页 > 移动开发 > Android开发

Android三种超简单办法,实现按钮倒计时

2017-07-20 09:09 302 查看


1、使用CountDownTimer

CountDownTimer是android中自带的倒计时类

需要两个参数,一个是总计时的时间,一般验证码是60秒,就是60*1000。第二个参数是设置计时的速度,1000就是每秒一次。

如果总长度是10秒,速度是1,那么就是10-9-8-7-6-5-4-3-2-1-0;

如果总长度是10秒,速度是2,那么就是10-8-6-4-2-0;

总时间是不变的,如果需要更精确的计时展现,就修改第二个参数。

在创建对象的时候,需要重写onTick和onFinish的方法。

onTick就是我们剩余的时间,需要将之转化成秒展示出来。

在倒计时的过程中把按钮禁用。

然后在onFinish倒计时结束的时候,按钮启用。

最后通过.start启动倒计时。

CountDownTimer timer = new CountDownTimer(10000, 1000) {
@Override
public void onTick(long millisUntilFinished) {
mTimer2.setEnabled(false);
mTimer2.setText("已发送(" + millisUntilFinished / 1000 + ")");

}

@Override
public void onFinish() {
mTimer2.setEnabled(true);
mTimer2.setText("重新获取验证码");

}
}.start();


2、使用线程

首先需要创建一个主线程,用来接收数据,改变UI

private int time=10;
private Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case 0:
setResult(RESULT_OK);
TimerButtonActivity.this.finish();
break;
case 4:
mTimer1.setEnabled(false);
mTimer1.setText("已发送(" + String.valueOf(time) + ")");
break;
case 5:
mTimer1.setEnabled(true);
mTimer1.setText("重新获取验证码");

time = 10;
break;
}

}
};


运行一个子线程,由于子线程中无法更新UI,所以需要根据time,将当前状态发送到主线程中,在主线程中操作。

当子线程执行的时候,按钮设置不可点击,并且将线程执行的结果一直发送给主线程,在主线程中动态显示倒计时。

当time倒计时为0的时候,将time重置,按钮重新设置可点击。

public void startTime1() {
Runnable runnable = new Runnable() {
@Override
public void run() {
time--;
if (time <= 0) {
mHandler.sendEmptyMessage(5);
} else {
mHandler.sendEmptyMessage(4);
mHandler.postDelayed(this, 1000);
}
}
};
new Thread(runnable).start();
}


3、使用Timer和TimerTask

Timer类官方的解释是多个线程共享一个计时器,也就是当使用了方法二之后,再使用三、线程会比开辟出来一部分给当前的线程。

假设总时间是10秒,点击按钮2,开始倒计时,同时点按钮3,时间会被瓜分掉。

但是只调用一个线程操作是没问题的。

private Timer timer = new Timer();
TimerTask task = new TimerTask() {
@Override
public void run() {

runOnUiThread(new Runnable() {
@Override
public void run() {
time--;
mTimer3.setText("已发送(" + String.valueOf(time) + ")");
mTimer3.setEnabled(false);
if (time <= 0) {
mTimer3.setEnabled(true);
mTimer3.setText("重新获取验证码");
}
}
});
}
};


在开始的时候调用

timer.schedule(task, time, 1000);


其实还有一些其他的办法:

比如重写Button按钮,同样需要用到线程,只不过,线程是在自定义button中执行。

相比来说第一种方法使用CountDownTimer是最简单的了。

但是具体实现还要看业务上的需求,去寻找最适合的方法。

源码在GitHub-android-CollectionDemo

是一个demo集合,主要存放自己平时练习的项目。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: