私は最近、データバインディングライブラリが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定型コードを使用する必要があることを知りたいと思います。