![](/img/trans.png)
[英]When it is ok to use strong references in android and does this code leak?
[英]Does the Android Data Binding Library hold Strong References on It's Callbacks?
我最近在某處讀到,數據綁定庫會將其偵聽器存儲為WeakReferences。 好吧,我簡直不敢相信,所以我看了一下數據綁定庫中的ObservableArrayMap實現:
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);
}
}
有很多事情發生,但是據我了解,回調函數存儲在一個List中,它告訴我是否不使用例如注銷回調。 removeOnMapChangedCallback()我冒着內存泄漏的風險。
我的Java內存管理技能僅限於信任GC並謹慎使用WeakReferences(我希望有空的時候有一天可以在該主題上進行改進)。 但是現在,我想知道我是否正確解釋了我的reasearch,並且在使用數據綁定庫時還必須使用典型的Observer注冊/取消注冊樣板代碼。
觀察到的項目不負責保持對所通知事物的弱引用。 因為Observable是一個接口,所以數據綁定系統不能相信該實現使用弱引用。
而是使用綁定類的中間弱引用類將觀察到的項綁定到生成的綁定。 由於要觀察的東西種類繁多,所以它有些復雜,但是該實現在ViewDataBinding.java中,您可以看到它是如何實現的。
本質上,觀察是:
觀察對象===>觀察者--->綁定類
其中---是弱參考,而===是強參考。 因為觀察者是一個弱引用,所以它不會產生對象引用開銷,如果它具有弱引用會發生這種情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.