解析 onTick 方法中的字符串是否会使我的应用程序崩溃?

Is parsing a string in the onTick method crashing my app?

我有一个简短的 CountDownTimer(最短 3 秒,最长 10 秒),用于控制屏幕上显示新数学问题的时间。每 1 秒,CountDownTimer 应该检查用户是否在 EditText 中输入了正确的答案。这是我的代码:

private void startQuestionTimer()
    {
        long startTime = DataHolder.getQuestionTime()*1000;
        questionTimer = new CountDownTimer(startTime, 1000) {

            @Override
            public void onTick(long millisUntilFinished) {
                //continually check user's input into the EditText
                //if input is ever equal to actualIntAnswer, reset the timer and EditText
                //then display another math problem
                int givenAnswer = Integer.parseInt(userAnswer.getText().toString());
                if (givenAnswer == actualIntAnswer)
                {
                    questionTimer.cancel();
                    userAnswer.getText().clear();
                    displayNewMathProblem();
                    questionTimer.start();
                }
            }

            @Override
            public void onFinish() {
                displayNewMathProblem();
                if (!testTimeExpired)
                {
                    questionTimer.start();
                }
                else
                {
                    questionTimer.cancel();
                }
            }
        }.start();
    }

我遇到的问题是应用程序在创建此 CountDownTimer 后立即崩溃。出于某种原因,int givenAnswer = Integer.parseInt(userAnswer.getText().toString()); 似乎使应用程序崩溃,我认为这是因为 CountDownTimer 无法在短短 1 秒内完成所有操作。我试着将它分成 2 种方法,如下所示:

private int givenAnswer;
private String givenAnswerToString()
    {
        return userAnswer.getText().toString();
    }

    private void givenAnswerToInt()
    {
        givenAnswer = Integer.parseInt(givenAnswerToString());
    }

然后像这样在 onTick() 中调用 givenAnswerToInt():

@Override
            public void onTick(long millisUntilFinished) {
                givenAnswerToInt();
                if (givenAnswer == actualIntAnswer)
                {
                    questionTimer.cancel();
                    userAnswer.getText().clear();
                    displayNewMathProblem();
                    questionTimer.start();
                }

            }

这是我在创建 CountDownTimer 时收到的错误消息:

这是怎么回事?这是一个像我认为的那样在短时间内尝试做太多事情的问题,还是完全是另外一回事?我该怎么做才能解决这个问题?

Integer.parseInt 可以抛出一个 NumberFormatException 如果没有被捕获,这将导致应用程序突然停止。
当您作为 parseInt 的参数传递的 String 未被识别为十进制数时,就会发生这种情况。
在您的代码中这几乎是瞬间发生的事实是由于 EditText.getText().toString() 刚刚返回 "",因为用户没有在小部件中键入任何数字。
您可以做的就是使用 try-catch 语句简单地管理异常:

int givenAnswer = 0; // initialize accordingly with your needs
try {
    givenAnswer = Integer.parseInt(userAnswer.getText().toString());
} catch (NumberFormatException e) {
    // return or do something else to deal with the problem
}

if(givenAnswer == actualIntAnswer){
    ...
}
...