Java Can';无法理解禁用按钮的行为

Java Can';无法理解禁用按钮的行为,java,android,countdowntimer,Java,Android,Countdowntimer,我是android新手,对Java中的计时概念也很陌生。我尝试创建一个简单的应用程序,它可以计算用户在五秒钟内点击屏幕的次数。时间结束后,我想禁用该按钮,并在单击“重新启动”按钮时重新启动所有内容 这是当前代码: public void clickCounter(View view){ ++counter; if(showCounter!=null) showCounter.setText(Integer.toString(counter)); } public

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

这是当前代码:

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秒钟后确实会禁用,但“重新启动”按钮有时会启用,然后立即禁用(计数器和文本会正确更改)


我认为问题可能在于我使用计时器的方式(也许我应该使用线程?

您在每次点击按钮时都会创建一个新的计时器。因此,当您重新启用该按钮时,您的一个计时器可能会过期,随后禁用该按钮。只有在没有计时器运行的情况下,才应创建新计时器。

您在每次点击按钮时都会创建一个新计时器。因此,当您重新启用该按钮时,您的一个计时器可能会过期,随后禁用该按钮。只有在没有计时器运行的情况下,才应该创建新计时器。

要扩展上的精彩答案,问题是每次调用
clickTimer()
方法时,都要创建一个新的CountDownTimer对象

按钮在5秒钟后确实会禁用,但“重新启动”按钮有时会启用,然后立即禁用(计数器和文本会正确更改)

这是为了扩展这个令人敬畏的答案,问题是每次调用
clickTimer()
方法时,您都在创建一个新的CountDownTimer对象

按钮在5秒钟后确实会禁用,但“重新启动”按钮有时会启用,然后立即禁用(计数器和文本会正确更改)


这我明白你的意思,但当我尝试它的应用程序崩溃。我是这样实现的:
public void clickCounter(View-View){if(counter==0)cdt.start();+counter;if(showCounter!=null)showCounter.setText(Integer.toString(counter));}public CountDownTimer cdt=new CountDownTimer(50005000){final Button Tap=findViewById(R.id.Tap);public void onTick(long millisuntiltfinished){}public void onFinish(){Tap.setEnabled(false);}}您放置了行
final按钮Tap=findviewbyd(R.id.Tap)在错误的位置。将其置于倒计时程序块之外。NullPointerException。
cdt.start()
在创建cdt之前执行。更好的是,您可以将其作为全局变量:
public CountDownTimer cdt
然后在onCreate()中使用它:
cdt=newcountdowntimer(50005000){…}
只有当我放置
final按钮Tap=findviewbyd(R.id.Tap)时,它才会工作cdt=new CountDownTimer(50005000){…}
中的code>。因此,为了确保我理解,cdt是在创建时创建的,从现在起,我可以随时使用cdt.start()调用它-每次都不创建新计时器?我理解你的意思,但当我尝试时,应用程序崩溃了。我是这样实现的:
public void clickCounter(View-View){if(counter==0)cdt.start();+counter;if(showCounter!=null)showCounter.setText(Integer.toString(counter));}public CountDownTimer cdt=new CountDownTimer(50005000){final Button Tap=findViewById(R.id.Tap);public void onTick(long millisuntiltfinished){}public void onFinish(){Tap.setEnabled(false);}}您放置了行
final按钮Tap=findviewbyd(R.id.Tap)在错误的位置。将其置于倒计时程序块之外。NullPointerException。
cdt.start()
在创建cdt之前执行。更好的是,您可以将其作为全局变量:
public CountDownTimer cdt
然后在onCreate()中使用它:
cdt=newcountdowntimer(50005000){…}
只有当我放置
final按钮Tap=findviewbyd(R.id.Tap)时,它才会工作cdt=new CountDownTimer(50005000){…}
中的code>。所以为了确保我理解,cdt是在create上创建的,从现在起,我可以随时使用cdt.start()调用它,而不必每次都创建新的计时器?