Handler 内存泄漏问题: 你在 MainActivity 其中创建了一个 Handler 对象,并用它来发送延迟信息。如果在 onDestroy 消息没有及时删除,可能会导致消息没有及时删除 Handler 对象持有 MainActivity 引用,进而导致内存泄漏。在 onDestroy 在方法上,应调用 handler.removeCallbacksAndMessages(null); 去掉所有的消息和回调。
@Overrideprotected void onDestroy() {super.onDestroy();handler.removeCallbacksAndMessages(null);}循环引用问题: 在 Handler.Callback 的实现中,直接引用了 MainActivity 的实例。这种引用关系可能会导致 MainActivity 物体不能被垃圾回收,导致内存泄漏。这种引用关系可能会导致这种引用关系 MainActivity 物体不能被垃圾回收,从而导致内存泄漏。为了解决这一问题,可以进行处理 Callback 类定义为 static 类别,或使用 WeakReference 包装 MainActivity。
private static class MyCallback implements Handler.Callback {private WeakReference<MainActivity> activityReference;
MyCallback(MainActivity activity) { activityReference = new WeakReference<>(activity);}@Overridepublic boolean handleMessage(@NonNull Message message) { MainActivity activity = activityReference.get(); if (activity != null) { // 处理消息 switch (message.what) { case UPDATE_TIME_MESSAGE: activity.updateTime(); activity.handler.sendEmptyMessageDelayed(UPDATE_TIME_MESSAGE, 60000); return true; default: return false; } } return false;}
}在 MainActivity 中使用 MyCallback:
private Handler.Callback callback = new MyCallback(this);线程安全: 更新主线程 UI 要保证线程安全。在 showNextMessage 在方法中,你在非 UI 线程更新了 messageTextView。在更新 UI 的时候,应该使用 runOnUiThread 或 Handler 的 post 确保方法在主线程中执行 UI 更新操作。
runOnUiThread(() -> messageTextView.setText("" + list.get(currentIndex)));通过解决这些问题,您的应用程序可能会更加稳定,以避免一些可能导致崩溃的情况。为了更好地定位和解决问题,记得在崩溃时检查相关的错误日志。