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

Android Studio Java应用更新TextView时崩溃问题求助

问题分析与修复方案

核心崩溃原因

从Logcat报错Resources$NotFoundException: String resource ID #0x368bd可以明确:调用TextView.setText(int)时,系统会把传入的整数当作字符串资源ID去查找,而非直接显示数字。比如App.getInstance().getLegajoAlumno()返回int类型,直接传入setText就会触发这个错误。

代码中的其他问题

  1. 重复调用setContentView:每次更新UI都重新加载布局,会销毁原有视图并重建,既浪费性能,还会导致视图引用失效。
  2. 重复查找控件:每次更新都调用findViewById属于冗余操作,控件引用只需在初始化阶段获取一次。
  3. 线程未妥善管理:Activity销毁时若线程未中断,会引发内存泄漏。

修复后的完整代码

public class MainActivity extends AppCompatActivity {
    private TextView tvLegajo;
    private TextView tvNFabrica;
    private Thread updateThread;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 仅在onCreate中设置一次布局
        setContentView(R.layout.activity_main);
        // 初始化控件引用
        tvLegajo = findViewById(R.id.txtLegajo);
        tvNFabrica = findViewById(R.id.txtNFabrica);

        // 创建更新线程
        updateThread = new Thread(){
            @Override
            public void run() {
                try {
                    while(!isInterrupted()){
                        Thread.sleep(1000);
                        // 切换到UI线程执行更新操作
                        runOnUiThread(() -> {
                            int legajo = App.getInstance().getLegajoAlumno();
                            // 将int转为字符串,避免被当作资源ID处理
                            tvLegajo.setText(legajo != 0 ? String.valueOf(legajo) : "");
                            // 若getnFabricaNotebook返回int类型,同样转为字符串
                            String nFabrica = String.valueOf(App.getInstance().getnFabricaNotebook());
                            tvNFabrica.setText(nFabrica);
                        });
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        };
        updateThread.start();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // Activity销毁时中断线程,防止内存泄漏
        if(updateThread != null){
            updateThread.interrupt();
        }
    }
}

关键修复点说明

  • int转字符串:通过String.valueOf()将整数类型的数值转为字符串,确保setText显示的是数字内容而非资源ID。
  • 初始化优化:布局加载和控件引用仅在onCreate中执行一次,避免重复操作带来的性能损耗。
  • 线程生命周期管理:在onDestroy方法中中断线程,防止Activity销毁后线程持续运行引发内存泄漏。

内容的提问来源于stack exchange,提问作者Gaspar Liboreiro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 14:55:17