无法正确使用处理程序

时间:2019-02-11 05:36:34

标签: java android runnable android-handler

我开始学习Android开发。我正在构建一个基本的加法游戏,用户必须单击显示两个数字相加的按钮。有四个 Textview个。第一个问题的答案是time limit。第二个为用户提供question。第三个给出用户的current score,最后一个给出所选的打开是正确还是不正确。 除第一个按钮外,其他所有功能均正常工作。每次按下按钮时,计数就非常快。

Screenshot

// When First button is pressed

public void onClickButton1(View view) {
        correctIncorrect.setVisibility(View.VISIBLE);
        if (Integer.parseInt(button1.getText().toString())==sum) {
            correctIncorrect.setText("Correct");
            correctUpdater();
        }
        else {
            correctIncorrect.setText("Incorrect");
            inCorrectUpdater();
        }

}

//Similar to all the buttons


//To Update the score

public void correctUpdater() {
        n++;
        yourScore++;
        score.setText(Integer.toString(yourScore) + "/" + Integer.toString(n));
        update();
}

public void inCorrectUpdater() {
    n++;
    score.setText(Integer.toString(yourScore) + "/" + Integer.toString(n));
    update();
}


// To update the timer

//=======================================================================//
    public void resetTimer() {
        timer.setText(Integer.toString(temp)+"s");
        if (temp == 0) {
            inCorrectUpdater();
            update();
        }
        else {
            timeUpdater();
        }

    }

    public void timeUpdater() {
        Handler timeHandler = new Handler();
        Runnable timeRunnable = new Runnable() {
            @Override
            public void run() {
                temp--;
                resetTimer();
            }
        };
        timeHandler.postDelayed(timeRunnable,1000);
    }
    //=================================================================//

// Updater function

public void update() {

        correctIncorrect.setVisibility(View.INVISIBLE);
        Random random = new Random();
        int a = random.nextInt(21);
        int b = random.nextInt(21);
        question.setText(Integer.toString(a) + " + " + Integer.toString(b));
        Log.i("info", "onCreate: a = " + a);
        Log.i("info", "onCreate: b = " + b);
        sum = a+b;
        Log.i("info", "onCreate: sum = " + sum);
        int whichButton = random.nextInt(4);
        Log.i("info", "onCreate: random button is " + whichButton);
        values.clear();
        for (int i = 0; i< 4; i++) {
            if (i == whichButton) {
                values.add(sum);
            }
            else {
                values.add(random.nextInt(50));
            }
            Log.i("info", "onCreate: value[" + i + "] = " + values.get(i));
        }
        button1.setText(Integer.toString(values.get(0)));
        button2.setText(Integer.toString(values.get(1)));
        button3.setText(Integer.toString(values.get(2)));
        button4.setText(Integer.toString(values.get(3)));
        temp = 10;
        resetTimer();
}

我错误地使用了 Handler 吗?我该怎么办?

1 个答案:

答案 0 :(得分:0)

  

我使用处理程序不正确吗?我该怎么办?

一种更好的方法是CountDownTimer,使用此方法,您自己就不必与处理程序打交道,并且还可以取消 >正在运行的CountDownTimer。

  

除“第一个按钮”外,所有其他功能均正常工作

不太确定是什么会导致在onClick()中具有相同代码的按钮单击时导致不同的行为。但是您可以考虑对这4个按钮使用相同的 onClickListener

View.OnClickListener myListener = new View.OnClickListener() {
        @Override
        public void onClick(View button) {
            correctIncorrect.setVisibility(View.VISIBLE);
            if (Integer.parseInt(button.getText().toString())==sum) {
                correctIncorrect.setText("Correct");
                correctUpdater();
            }
            else {
                correctIncorrect.setText("Incorrect");
                inCorrectUpdater();
            }
        }
    };

button1.setOnClickListener(myListener);
button2.setOnClickListener(myListener);
button3.setOnClickListener(myListener);
button4.setOnClickListener(myListener);

这将确保单击这四个按钮中的任何一个都具有相同的行为(当然取决于答案)

如果您对CountDownTimer的onTick()方法感到困惑,则可以使用modified CountDownTimer来确保计时器不会错过任何滴答声。