簡體   English   中英

Android數據綁定庫是否在其回調中包含強引用?

[英]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);
}

上面插入的代碼將我指向擴展CallbackRegistryMapChangeRegistry

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM