Handler 内存泄漏问题: 你在 MainActivity 中创建了一个 Handler 对象,并使用它来发送延迟消息。如果在 onDestroy 中没有及时移除消息,可能导致 Handler 对象持有 MainActivity 的引用,进而引起内存泄漏。在 onDestroy 方法中,应该调用 handler.removeCallbacksAndMessages(null); 来移除所有消息和回调。
@Override protected void onDestroy() { super.onDestroy(); handler.removeCallbacksAndMessages(null); } 循环引用问题: 在 Handler.Callback 的实现中,直接引用了 MainActivity 的实例。这样的引用关系可能导致 MainActivity 对象无法被垃圾回收,从而造成内存泄漏。为了解决这个问题,可以将 Callback 类定义为 static 类,或者使用 WeakReference 包装 MainActivity。
private static class MyCallback implements Handler.Callback { private WeakReference<MainActivity> activityReference;
MyCallback(MainActivity activity) {
activityReference = new WeakReference<>(activity);
}
@Override
public 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))); 通过解决这些问题,你的应用可能会更加稳定,避免一些可能导致崩溃的情况。记得在发生崩溃时查看相关的错误日志,以便更好地定位和解决问题。