简短结论:Java 观察者模式本身不会必然导致内存泄漏,但如果使用不当(尤其是强引用 + 长期不注销),是很容易造成内存泄漏的。
下面分点说明。
观察者模式通常包含:
关系一般是:
Subject → 持有 Observer 的引用
如果:
那么:
Subject 一直持有 Observer 的强引用
→ Observer 无法被 GC
→ Observer 引用的 Activity / View / Context 也泄漏
subject.registerObserver(this); // Activity 作为观察者
// Activity 销毁时忘记 subject.removeObserver(this)
结果:Activity 被 Subject 强引用,无法回收。
以下情况通常是安全的:
✅ Observer 和被观察者生命周期一致
✅ 在合适的生命周期方法中及时注销
✅ 使用弱引用(WeakReference)
例如:
subject.removeObserver(this); // onDestroy / close
@Override
protected void onDestroy() {
subject.removeObserver(this);
super.onDestroy();
}
class WeakObserver implements Observer {
private final WeakReference<RealObserver> ref;
WeakObserver(RealObserver o) {
this.ref = new WeakReference<>(o);
}
public void update() {
RealObserver o = ref.get();
if (o != null) o.update();
}
}
java.beans / PropertyChangeSupport(仍需注意注销)LiveData(生命周期感知,推荐)Flow / RxJava + 生命周期绑定EventBus(需 @Subscribe + unregister)观察者模式不是内存泄漏的根源,强引用 + 不注销才是。
如果你愿意,我可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。