Android Studio按钮点击TextView无响应且主线程卡顿问题求助
问题分析与解决方案
核心问题排查
- 整数转换异常:如果
TextView为空或包含非数字内容,Integer.parseInt()会抛出NumberFormatException,直接中断getCalculations()方法执行,导致点击按钮后无任何反应。 - 多条件触发多对话框:代码中多个独立
if判断可能同时满足条件,导致多个AlertDialog同时弹出,占用主线程UI资源,引发Skipped frames提示,同时造成交互混乱。 - 冗余代码:重复创建
AlertDialog.Builder,增加不必要的主线程工作量。
修复步骤
1. 捕获整数转换异常
在将字符串转为整数时加入异常处理,避免因输入非法导致方法中断。
2. 优化条件判断结构
将独立if改为else if,确保同一时间只有一个条件触发,避免多对话框同时弹出。
3. 复用对话框创建逻辑
提取通用的对话框创建方法,减少代码冗余,降低主线程负载。
4. 确认控件绑定正确
确保txtT、txtD等TextView已通过findViewById正确绑定布局中的对应控件。
修改后的代码示例
btn2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { getCalculations(); } }); private void getCalculations() { // 初始化默认值,避免空输入导致异常 int numberT = 0; int numberD = 0; int numberS = 0; int numberC = 0; int numberA = 0; // 捕获转换异常 try { numberT = Integer.parseInt(txtT.getText().toString().trim()); numberD = Integer.parseInt(txtD.getText().toString().trim()); numberS = Integer.parseInt(txtS.getText().toString().trim()); numberC = Integer.parseInt(txtC.getText().toString().trim()); numberA = Integer.parseInt(txtA.getText().toString().trim()); } catch (NumberFormatException e) { // 输入非法时提示用户 showAlertDialog("提示", "请输入有效的数字"); return; } // 优化条件判断,同一时间仅触发一个分支 if (numberT > 4 && numberD < 0) { showAlertDialog("Notice", getString(R.string.massege2), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { int scoreD = numberD - 1; int scoreT = numberT - 5; int scoreA = numberA - 500; txtT.setText(String.valueOf(scoreT)); txtD.setText(String.valueOf(scoreD)); txtA.setText(String.valueOf(scoreA)); } }); } else if (numberT > 4 && numberD == 0 && numberC < 10) { showAlertDialog("Notice", getString(R.string.massege2), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { int scoreT = numberT - 5; int scoreA = numberA - 500; int scoreC = numberC + 1; int scoreS = numberS - 1; txtT.setText(String.valueOf(scoreT)); txtA.setText(String.valueOf(scoreA)); txtC.setText(String.valueOf(scoreC)); txtS.setText(String.valueOf(scoreS)); } }); } else if (numberT > 4 && numberD == 0 && numberC == 10) { showAlertDialog("Notice", getString(R.string.massege3), null); } else if (numberT < 5) { showAlertDialog("Notice", getString(R.string.massege4), null); } } // 复用对话框创建方法 private void showAlertDialog(String title, String message, DialogInterface.OnClickListener positiveListener) { AlertDialog.Builder adb = new AlertDialog.Builder(WalletActivity.this); adb.setTitle(title); adb.setMessage(message); if (positiveListener != null) { adb.setPositiveButton("OK", positiveListener); } else { adb.setPositiveButton("OK", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // 默认空实现 } }); } adb.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // 取消按钮空实现 } }); adb.show(); }
额外说明
- 使用
trim()去除字符串前后空格,避免因空格导致转换失败。 - 直接调用
getString()替代getApplicationContext().getResources().getString(),更简洁高效。 - 异常捕获后及时提示用户输入错误,提升交互体验。
内容的提问来源于stack exchange,提问作者Dr. FOK
相关产品推荐
相关产品推荐

