问题描述
我不确定从长远来看这是否会给我带来一些内存泄漏问题,并且我想知道在这种情况下使用弱引用是否会有所不同:
public abstract class ChangeObserver<X extends SomeClass> {
X someClass;
public ChangeObserver(X someClass) {
this.someClass= someClass;
}
public void notifySomeClass(
) {
onChanged().onChanged(someClass);
}
public abstract OnDataChanged<X> onChanged();
@FunctionalInterface
public interface OnDataChanged<X> {
void onChanged(X x);
}
}
这会在程序的生命周期中引起问题吗?是否可以通过使用弱引用来解决?
感谢@Hulk和@tashkhisi,我提供了此解决方案,如果缺少某些内容,请随时进行纠正。
public abstract class ChangeObserver<X extends SomeClass> {
private WeakReference<X> someClassWeakRef;
private OnDataChanged<X> observer;
public ChangeObserver(X someClass) {
this.someClassWeakRef = new WeakReference<>(someClass);
observer = onChanged();
}
public void notifySomeClass(
) {
observer.onChanged(someClassWeakRef.get());
}
public abstract OnDataChanged<X> onChanged();
@FunctionalInterface
public interface OnDataChanged<X> {
void onChanged(X x);
}
}
我仍然缺少的是这个removeObserver()方法究竟应该做什么以删除观察者,如果我要使用那种避免内存泄漏的特定方法,是否只是设置观察者= null吗?
谢谢。
解决方法
是的,在Java的Observer
模式中有很多解决内存泄漏的方法,其中一种是在您的类中添加另一种方法,例如removeObserver
,以便在您从Observable
移除Observer对象时不再需要它们了,第二种方法是使用如下所示的弱引用:(我宁愿将其命名为someObject
而不是someClass
,但我遵守了您的命名约定)
WeakReference<X> x = new WeakReference<X>(someClass);