首页 > 解决方案 > 为什么onFinish在android studio中运行多次?

问题描述

我创建了一个计算点击次数的按钮并创建了一个 5 秒的计时器。5秒后,我想通过将计数器除以5来找到每秒点击次数(cps)。但是,问题是在我将计数器重置为0后,查找cps的代码仍然在onFinish方法中运行,并且使 cps 也为 0。

protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mtextViewCountDown = (TextView) findViewById(R.id.text_view_countdown);
        btnClick = (Button) findViewById(R.id.button2);
        displayCPS = (TextView) findViewById(R.id.cps);

        btnClick.setOnClickListener(new View.OnClickListener() {
            @Override

            public void onClick(View v) {

                startTimer();
                counter++;
                btnClick.setText(Integer.toString(counter));

            }
        });
    }
    public void startTimer(){
        countDownTimer = new CountDownTimer(timeLeft,1000){
            public void onTick(long l){

                timeLeft = l;
                updateTimer();
            }
            public void onFinish() {

                cps = counter / 5;
                System.out.println(cps);
                displayCPS.setText("CPS: " + Double.toString(cps));


            }
        }.start();
    }
    public void updateTimer(){
        int minutes = 0;
        int seconds = (int) timeLeft / 1000;
        String timeLeftFormatted = String.format(Locale.getDefault(),"%02d:%02d", minutes, seconds);
        mtextViewCountDown.setText(timeLeftFormatted);

    }
    public void resetTimer(){
        counter = 0;
        btnClick.setText(Integer.toString(0));
        timeLeft = 5000;

    }

我尝试调试它并在控制台中打印出 cps。

I/System.out: 5.0
I/System.out: 0.0
I/chatty: uid=10088(com.example.cpspractice) identical 14 lines
I/System.out: 0.0
I/System.out: 0.0
I/chatty: uid=10088(com.example.cpspractice) identical 10 lines
I/System.out: 0.0

似乎 onFinish 运行了多次。你们知道如何让它只运行一次吗?

标签: javaandroid

解决方案


onFinish()运行一次 - 但您启动的每个计时器都会运行一次。

似乎每次单击按钮时都会启动一个计时器,因此如果您点击该按钮 20 次,您将启动 20 个计时器,并且每个计时器都会onFinish()调用一次它的方法。

要修复仅启动一个计时器的问题,例如在第一次单击时:

    btnClick.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            counter++;
            if (counter == 1) {
                startTimer();
            }
            btnClick.setText(Integer.toString(counter));

        }
    });

推荐阅读