无法理解禁用按钮的行为

Can't understand disable button behavior

我是 android 的新手,对 Java 中的计时概念也很陌生。我试图创建一个简单的应用程序来计算用户在五秒钟内点击屏幕的次数。时间结束后,我想禁用按钮并在单击 'Restart' 按钮时重新启动所有内容。

这是当前代码:

public void clickCounter(View view){
    ++counter;
    if(showCounter!=null)
        showCounter.setText(Integer.toString(counter));
}
public void clickTimer(final View view) {
   final Button Tap = findViewById(R.id.Tap);
   clickCounter(view);
    new CountDownTimer(5000, 5000) {
        public void onTick(long millisUntilFinished) {
        }

        public void onFinish() {
          Tap.setEnabled(false);
        }
    }.start();
        }


public void restartCounter(View view) {
    counter=0;
    showCounter.setText("Tap");
    final Button Tap = findViewById(R.id.Tap);
    Tap.setEnabled(true);
}

该按钮在 5 秒后确实禁用,但重启按钮有时会启用然后立即禁用它(计数器和文本会正确更改)。

我认为问题可能出在我使用 Timer 的方式上(也许我应该使用线程?)

您在每次点击按钮时创建一个新计时器。因此,当您重新启用该按钮时,您的一个计时器可能会到期,然后禁用该按钮。如果有 none 运行.

,您应该只创建一个新计时器

为了扩展 Tiago Loureino 的出色答案,问题是每次调用 clickTimer() 方法时您都在创建一个新的 CountDownTimer 对象。

The button does disable after 5 seconds, but the restart button sometimes enables and then disables it right away (the counter and text changes properly).

发生这种情况是因为您有多个 CountDownTimer 正在执行它们的 onFinish() 方法。

此问题的解决方案是拥有一个 CountDownTimer 实例。要将其放入代码中,您可以如下声明 CountDownTimer:

public CountDownTimer cdt = new CountDownTimer(5000, 5000) {
    public void onTick(long millisUntilFinished) {
    }

    public void onFinish() {
            Tap.setEnabled(false);
    }
};

然后您可以随时调用 cdt.start() 启动计时器。