2016-07-09 7 views
0

私は最近、データバインディングライブラリがWeakReferencesとしてリスナーを格納する場所を読んでいました。Androidデータバインディングライブラリは、コールバックで強力な参照を保持していますか?

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); 
} 

上記切り取らコードはCallbackRegistryを拡張MapChangeRegistryに私を指す:

あり
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); 
    } 
} 

まあ、私はデータバインディングライブラリのObservableArrayMap実装を見ていたので、それを信じることができませんでした多くのことが起こっていますが、私が理解しているように、コールバックはList内に格納されています。 removeOnMapChangedCallback()メモリリークの危険があります。

私のJavaのメモリ管理のスキルは、GCを信頼し、慎重に(私は時間があるときに私は、いつかそのトピックに改善したい)WeakReferencesを使用するように制限されています。しかし、今は私がreasearchを正しく解釈したかどうか、またData Binding Libraryを使用するときに典型的なObserver register/unregister定型コードを使用する必要があることを知りたいと思います。

答えて

2

観察項目が通知され、物事への弱い参照を維持するための責任を負いません。 Observableはインターフェイスなので、データバインディングシステムは、実装で弱い参照を使用することを信頼できません。

代わりに、観察されたアイテムは、結合クラス中間弱参照クラスを使用して結合バック生成に接続されています。これは多少の複雑なタイプのものがあるため、実装はViewDataBinding.javaにあり、どのように実装されているかを見ることができます。

は、本質的に観察される:

観察対象物===>オブザーバ - - - > Bindingクラス

- - - 弱参照と===強い参照です。オブザーバー弱い参照をするので、それはそれ弱い参照を持っていたらどうなるオブジェクト数のオーバーヘッドを生成しません。

関連する問題