Android应用onResume中TextView触发NullPointerException问题求助
Android应用崩溃与生命周期异常问题排查修复
一、紧急崩溃问题(NullPointerException)
问题根源
- 重复调用
setContentView():在onResume()中再次执行setContentView()会重新加载布局,导致新获取的TextView实例可能未正确绑定,或与onCreate()中初始化的tv1不是同一个对象,后续调用append时触发空指针。 - 未判空的文件内容:读取文件时,若
line为空字符串或null,调用tv.append(line)会触发CharSequence.length()的空指针异常(append内部依赖该方法)。
修复方案
- 移除
onResume()中的setContentView():将TextView实例声明为Activity的成员变量,在onCreate()中一次性初始化并保存,后续生命周期方法直接复用该实例。 - 文件读取时判空:对读取到的
line做非空判断,避免传入空值给append。 - IO操作移至子线程:文件读取属于耗时操作,放在主线程可能导致ANR,建议在子线程执行,通过
runOnUiThread()更新UI。
修正后代码示例
public class YourActivity extends AppCompatActivity { // 声明成员变量保存TextView实例 private TextView tv1; private SensorManager sensorManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.your_layout); // 一次性初始化视图与传感器 tv1 = findViewById(R.id.tv1); tv1.append("占位文本"); tv1.setVerticalScrollBarEnabled(true); sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); } @Override protected void onResume() { super.onResume(); // 移除重复的setContentView与findViewById // 子线程读取文件,避免阻塞主线程 new Thread(() -> { try { File file = new File("/YYY/XXX.txt"); BufferedReader reader = new BufferedReader(new FileReader(file)); String line; while ((line = reader.readLine()) != null) { final String finalLine = line; // 主线程更新UI runOnUiThread(() -> { if (finalLine != null && !finalLine.isEmpty()) { tv1.append(finalLine); } }); } reader.close(); } catch (IOException e) { e.printStackTrace(); } }).start(); } @Override protected void onPause() { super.onPause(); // 这里添加传感器注销等操作 } }
二、生命周期异常(返回主屏幕时onCreate日志打印)
可能原因
- Activity的
launchMode配置异常(如设置为singleInstance),导致返回主屏幕后再次进入时重建Activity。 - 未处理配置变化(如屏幕旋转),系统会销毁并重建Activity,触发
onCreate()。 - 内存不足时系统回收了Activity,返回时重新创建。
排查方向
- 检查
AndroidManifest.xml中对应Activity的launchMode,建议保持默认的standard模式。 - 若需固定配置(如屏幕方向),可在Manifest中添加
android:configChanges="orientation|screenSize",避免重建。
内容的提问来源于stack exchange,提问作者SonOfEl
相关产品推荐
相关产品推荐

