2016-07-09 5 views
0

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.

Antwort

2

Die beobachteten Artikel sind nicht dafür verantwortlich, schwache Hinweise auf die zu benachrichtigenden Dinge beizubehalten. Da Observable eine Schnittstelle ist, kann das Datenbindungssystem nicht darauf vertrauen, dass die Implementierung schwache Referenzen verwendet.

Stattdessen werden die beobachteten Elemente mit einer mittleren schwachen Referenzklasse an die Bindungsklasse gebunden. Es ist etwas komplex, weil es so viele verschiedene Dinge zu beobachten gibt, aber die Implementierung ist in ViewDataBinding.java und Sie können sehen, wie es implementiert ist.

Wesentlichen die beobachtenden ist:

beobachtetes Objekt ===> Observer - - -> Binding-Klasse

, wo der - - - ist die schwache Referenz und === ist eine starke Referenz. Da der Observer eine schwache Referenz ist, generiert er keinen Objektanzahl-Overhead, der auftreten würde, wenn er eine schwache Referenz hätte.

Verwandte Themen