境界观察者未被删除

时间:2018-02-14 18:32:34

标签: android realm realm-mobile-platform

我正在使用像这样的小帮手类

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

startstop onResume和`onPause``

中我的片段中的听众

现在我看到那些观察者被正确删除了。我已深入了解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;
    }

失败,因为它是一个不同的监听器,因此不会被删除。

我做错了什么或这是一个领域错误?

1 个答案:

答案 0 :(得分:1)

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项目。