czytałem to pytanie, które właśnie dostałem pytanie: Avoid memory leaks in callbacks?Czy anonimowi słuchacze są niekompatybilni ze słabymi referencjami?
i byłem zupełnie zdezorientowany, aż ktoś odpowiedział na następujące:
„Problem z tym podejściem jest to, nie może mieć słuchacza, który odwołuje się tylko w kolekcji jako zniknie losowo (na następnym GC)”
mam rację w moim rozumieniu, że za pomocą słabe odwołania, jak przy przechowywaniu w WeakHashMap, jest niezgodna z anonimowych słuchaczy?
I zwykle przechodzą słuchaczy tak:
public static void main(String[] args) {
final Observable obs = new SomeObservable();
obs.addObserver(new Observer() {
public void update(final Observable o, final Object arg) {
System.out.println("Notified");
}
});
obs.notifyObservers();
... // program continues its life here
}
private static final class SomeObservable extends Observable {
@Override
public void addObserver(final Observer o) {
super.addObserver(o);
setChanged(); // shouldn't be done from here (unrelated to the question)
}
}
I śledzić słuchaczy za pomocą CopyOnWriteArrayList (domyślne Obserwowalne powyżej najwyraźniej wykorzystuje starą Vector ale jego tylko przykład do pokaż, jak zwykle tworzę anonimową klasę, która posłuży jako słuchacz).
Jako pytanie dodatkowe: kiedy odwołanie do anonimowego odbiorcy kwalifikowałoby się do GC, gdyby obserwowalny obiekt korzystał z WeakHashMap? Gdy metoda zakończy działanie? Jak tylko zakończone zostanie wywołanie obs.addObserver?
Jestem nieco zdezorientowany tym, gdzie/jak/kiedy odniesienia do anonimowych wystąpień klas są przechowywane/przechowywane/niewidoczne dla GC.
Oczywiście, jeśli zachowuję normalne odniesienie, to nie kwalifikuje się do GC, ale co, kiedy jest w WeakHashMap, kiedy dokładnie słuchacza stają się widoczne dla GC?
Dziękuję za pomoc, rozumiem to.Ale moje pytanie naprawdę odnosi się do anonimowych słuchaczy: jeśli umieściłem odniesienie do anonimowego słuchacza w WeakHashMap, czy istnieje inne odniesienie do tego anonimowego słuchacza trzymanego gdzieś indziej? Jeśli nie, to w którym momencie GC staje się niewidoczny? Po jakim telefonie? –