Android Studio Java应用更新TextView时崩溃问题求助
问题分析与修复方案
核心崩溃原因
从Logcat报错Resources$NotFoundException: String resource ID #0x368bd可以明确:调用TextView.setText(int)时,系统会把传入的整数当作字符串资源ID去查找,而非直接显示数字。比如App.getInstance().getLegajoAlumno()返回int类型,直接传入setText就会触发这个错误。
代码中的其他问题
- 重复调用
setContentView:每次更新UI都重新加载布局,会销毁原有视图并重建,既浪费性能,还会导致视图引用失效。 - 重复查找控件:每次更新都调用
findViewById属于冗余操作,控件引用只需在初始化阶段获取一次。 - 线程未妥善管理: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
相关产品推荐
相关产品推荐

