You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Studio按钮点击TextView无响应且主线程卡顿问题求助

问题分析与解决方案

核心问题排查

  1. 整数转换异常:如果TextView为空或包含非数字内容,Integer.parseInt()会抛出NumberFormatException,直接中断getCalculations()方法执行,导致点击按钮后无任何反应。
  2. 多条件触发多对话框:代码中多个独立if判断可能同时满足条件,导致多个AlertDialog同时弹出,占用主线程UI资源,引发Skipped frames提示,同时造成交互混乱。
  3. 冗余代码:重复创建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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 04:00:44