[英]Does WeakReference<> helps with GC on this specific scenario?
我不確定從長遠來看這是否會給我帶來一些內存泄漏問題,我想知道在這種情況下使用弱引用是否有什么不同:
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
刪除觀察者對象,第二種方法是使用 Weak參考如下:(我寧願將其命名為someObject
而不是someClass
但我遵守了您的命名約定)
WeakReference<X> x = new WeakReference<X>(someClass);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.