伙计我是日食的新手,我在日食中练习计时器,我可以为我的代码提供一些帮助吗? 下面的代码就像我点击触发按钮计数时一样,它会触发另一次计数而不会停止前一次计数。
我在按下计数后尝试了按钮或反应它,我仍然想知道如何使相同的触发按钮获得重启计数功能。你可以直接嵌入我的代码来帮助我吗?我知道我太新了,日食,java甚至英国,一切,我需要你的解释,如果它不会占用太多。
Button countDownButton2 = (Button) findViewById(R.id.countDown1);
countDownButton2.setOnClickListener(new View.OnClickListener() {
public void onClick(View view){
CountDownTimer timer2 = new CountDownTimer(3000,1000){
@Override
public void onFinish() {
mTimeLabel1.setText("Times Up baby!");
}
@Override
public void onTick(long millisUntilFinished) {
int seconds = (int) (millisUntilFinished / 1000);
int minutes = seconds / 60;
seconds = seconds % 60;
mTimeLabel1.setText("" + minutes + ":"
+ String.format("%02d", seconds));
}
}.start();
}
});
答案 0 :(得分:0)
您当前的解决方案是创建一个新的倒计时器,但不会停止旧的倒计时器。因此,如果再次单击该按钮,则会有2个倒计时器。当你说" new CountDowntimer"时,就是你创建它的时候。因此,在创建新的之前,请确保停止前一个。
Button countDownButton2 = (Button) findViewById(R.id.countDown1);
countDownButton2.setOnClickListener(new View.OnClickListener() {
CountDownTimer timer2;
public void onClick(View view){
if(timer2!=null){
timer2.cancel();
}
timer2 = new CountDownTimer(3000,1000){
@Override
public void onFinish() {
mTimeLabel1.setText("Times Up baby!");
}
@Override
public void onTick(long millisUntilFinished) {
int seconds = (int) (millisUntilFinished / 1000);
int minutes = seconds / 60;
seconds = seconds % 60;
mTimeLabel1.setText("" + minutes + ":"
+ String.format("%02d", seconds));
}
}.start();
}
});
<强>解释强>
以前,每次点击按钮都会有一个新的CountDownTimer。每个倒数计时器都在改变标签mTimeLabel1的值。创建新计时器是因为在点击列表中,您正在执行此操作:
CountdownTimer2 timer2 = new CountDownTimer(3000,1000)
这意味着,创建一个新的Timer,并保持对它的引用,称为timer2。 onClick方法完成后,计时器继续运行。但是,再次单击时,您将创建一个新计时器,并且旧计时器的新引用将丢失。引用不是旧的,而是新的。
因此,我们确保点击侦听器只有一个计时器。为此,我们在onClick方法之外移动对它的引用,以便我们可以保留对计时器的引用。然后我们可以确保在启动另一个计时器之前检查此计时器以取消它。但是,如果这是您第一次点击按钮,那么计时器将为空,因为&#34; new CountdownTimer&#34;尚未被召唤。因此,我们检查它是否为空(它不是第一次按下按钮),如果不是,则在创建新按钮之前取消旧按钮。如果是按下第一个按钮,我们不想打电话取消,因为没有计时器可以取消。