按下按钮后定时器闪烁

timer flicks after button press

我正在尝试在应用程序上放置一个计时器。我正在使用下面的代码,它适用于创建。但是,如果第二次按下按钮,秒数就会开始变得混乱,并且会轻弹一下。 有任何想法吗?

 package com.example.android.courtcounter;

import android.os.Bundle;
import android.os.CountDownTimer;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import java.util.concurrent.TimeUnit;

public class MainActivity extends AppCompatActivity {
    public int counter;
    TextView timer;
    Button button;
    private static final String FORMAT = "%02d:%02d";


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button = (Button) findViewById(R.id.button);
        timer = (TextView) findViewById(R.id.timer);
        button.setOnClickListener(new View.OnClickListener() {

            public void onClick(View V) {
                new CountDownTimer(2400000, 1000) {
                    public void onTick(long millisUntilFinished) {
                        timer.setText (String.format(FORMAT, TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished),
                                TimeUnit.MILLISECONDS.toSeconds(millisUntilFinished) -
                                TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished))));


                                }

                    public void onFinish() {
                        timer.setText("done!");
                    }
                }.start();


            }
        });
    }
}

CountDownTimer 可能在其自身的旧实例上闪烁。在重新开始倒计时之前尝试调用 cancel()。

在整个 Activity 中管理 CountDownTimer 的单个实例。您在同一个 Activity 上有多个实例可能会变得混乱。首先在 onCreate 之外,但在 class 之内,首先将其声明为

CountDownTimer countDownTimer;

然后在您的 Button 的 onClickListener onClick 方法中执行此操作:

if(countDownTimer!=null){
   countDownTimer.cancel();
}
countDownTimer= new CountDownTimer(2400000, 1000) {
                public void onTick(long millisUntilFinished) {
                    timer.setText (String.format(FORMAT, TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished),
                            TimeUnit.MILLISECONDS.toSeconds(millisUntilFinished) -
                            TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished))));


                            }

                public void onFinish() {
                    timer.setText("done!");
                }
            }.start();

从这里您将只管理 class 的一个实例,而不是在每次单击按钮时创建更多实例。