Ich habe kürzlich irgendwo gelesen, dass die Data Binding Library ihre Listener als WeakReferences speichern würde. Nun konnte ich es nicht glauben, so nahm ich einen Blick auf die ObservableArrayMap Implementierung in der Datenbindung Library:Verfügt die Android Data Binding Library über starke Hinweise auf ihre Callbacks?
private transient MapChangeRegistry mListeners;
...
@Override
public void addOnMapChangedCallback(
OnMapChangedCallback<? extends ObservableMap<K, V>, K, V> listener) {
if (mListeners == null) {
mListeners = new MapChangeRegistry();
}
mListeners.add(listener);
}
Der Code snipped oben weist mich auf die MapChangeRegistry die CallbackRegistry erweitert:
private List<C> mCallbacks = new ArrayList<C>();
...
public synchronized void add(C callback) {
if (callback == null) {
throw new IllegalArgumentException("callback cannot be null");
}
int index = mCallbacks.lastIndexOf(callback);
if (index < 0 || isRemoved(index)) {
mCallbacks.add(callback);
}
}
Es Es passiert viel herum, aber wie ich verstanden habe, wird der Callback in einer Liste gespeichert, die mir sagt, ob ich meine Callbacks nicht mit zB abmelden möchte. removeOnMapChangedCallback() Ich riskiere Speicherlecks.
Meine Java-Speicherverwaltungsfähigkeiten sind darauf beschränkt, dem GC zu vertrauen und WeakReferences vorsichtig zu verwenden (ich möchte dieses Thema eines Tages verbessern, wenn ich Zeit dazu habe). Aber jetzt würde ich gerne wissen, ob ich meine Forschung richtig interpretiert habe und dass ich auch den typischen Observer-Register-/Unregister-Code verwenden muss, wenn ich die Data Binding Library verwende.