解析 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){
...
}
...
我有一个简短的 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){
...
}
...