簡體   English   中英

領域觀察者未刪除

[英]Realm observer not removed

我正在使用像這樣的小助手類

class RealmWatcher<T>(private val query: RealmResults<T>,
                      private val handler: (RealmResults<T>) -> Unit,
                      private val logger: Logger? = null) {

    private val handlerWrapper: (RealmResults<T>) -> Unit = { result ->
        logger?.trace("⟳  '$result")
        handler.invoke(query)
    }

    fun start() {
        stop()
        handler.invoke(query)
        query.addChangeListener(handlerWrapper) 
    }

    fun stop() {
        query.removeChangeListener(handlerWrapper)
    }
}

onResume和onPause中的片段中startstop偵聽器

現在,我看到那些觀察者已被正確刪除。 我已經深入Realm,並在OsResults看到了這些行

public <T> void removeListener(T observer, RealmChangeListener<T> listener) {
    removeListener(observer, new RealmChangeListenerWrapper<T>(listener));
}

這使我想到領域內部存在錯誤。 因為創建了一個新的RealmChangeListenerWrapper包裝器,並且

    public boolean equals(Object obj) {
        return obj instanceof RealmChangeListenerWrapper &&
                listener == ((RealmChangeListenerWrapper) obj).listener;
    }

失敗,因為它的監聽器不同,因此不會被刪除。

我是在做錯什么還是這是一個領域錯誤?

public boolean equals(Object obj) {
    return obj instanceof RealmChangeListenerWrapper &&
            listener == ((RealmChangeListenerWrapper) obj).listener;
}

addListenerremoveListener創建一個RealmChangeListenerWrapper ,因此絕對是正確的。

它驗證listener是相同的實例與其他listener ,所以應該工作太多,如果您刪除您以前注冊了相同的監聽器。

所以假設你打電話

realmWatcher.start()
// change listener should be added
realmWatcher.stop()
// change listener should be removed

然后,應該從RealmResults中正確刪除觀察者,因為handlerWrapper都是同一實例。

如果那沒有發生,我將感謝一個示例github項目,它再現了這一點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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