我正在使用像这样的小帮手类
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)
}
}
start
和stop
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;
}
失败,因为它是一个不同的监听器,因此不会被删除。
我做错了什么或这是一个领域错误?
答案 0 :(得分:1)
public boolean equals(Object obj) {
return obj instanceof RealmChangeListenerWrapper &&
listener == ((RealmChangeListenerWrapper) obj).listener;
}
addListener
和removeListener
都会创建RealmChangeListenerWrapper
,所以这绝对是真的。
它验证listener
与其他listener
是同一个实例,因此如果你删除之前注册的同一个侦听器,它也应该有用。
所以假设你打电话
realmWatcher.start()
// change listener should be added
realmWatcher.stop()
// change listener should be removed
然后应该从RealmResults中正确删除观察者,因为handlerWrapper
两次都是同一个实例。
如果这种情况没有发生,我很欣赏一个重现这一点的示例github项目。