Document.ChangeListener 已在 Couchbase Lite 中删除
Document.ChangeListener are removed in Couchbase Lite
我在 Android 中使用 Couchbase Lite。我有一份文件,我需要在上面添加一个 Document.ChangeListener(以便在该文件更改时更新 UI)。
我添加了它,但它似乎被删除了 "automagically",我不知道为什么。我有一个方法 "attachDocumentChangeListener" 我称之为:
public void attachDocumentChangeListener(String documentId, final DocumentChangeListener<TData> listener) {
getDefaultDatabase().getDocument(documentId).addChangeListener(listener);
}
我不再触摸我的设备,而是通过另一台设备对文档进行更新。这应该触发 ChangeEvent 但似乎没有发生。
我注意到当文档更新时,文档没有ChangeListener
(即使我之前添加了一个juste)。为了检查 ChangeListener
何时被删除,我在 Document
class 的函数 removeChangeListener(ChangeListener changeListener)
中添加了一个断点,但是从未调用过并且字段 changeListeners
是更新后还是空的
我添加了另一个断点,changeListeners
上的一个现场观察点。这是此断点配置的屏幕截图:
我重复了该操作(使用另一台设备更新文档),但除了显示 ChangeListener 的日志已被删除(不知道如何),我什么也没看到
{com.couchbase.lite.Document@6.888}.changeListeners will be accessed at com.couchbase.lite.Document.addChangeListener(Document.java:169)
size : 0, ID : 8980450c-5ddb-4181-a7bf-3e162c67a68f
{com.couchbase.lite.Document@6.888}.changeListeners will be accessed at com.couchbase.lite.Document.addChangeListener(Document.java:169)
size : 1, ID : 8980450c-5ddb-4181-a7bf-3e162c67a68f
{com.couchbase.lite.Document@9.975}.changeListeners will be accessed at com.couchbase.lite.Document.addChangeListener(Document.java:169)
size : 0, ID : 8980450c-5ddb-4181-a7bf-3e162c67a68f
{com.couchbase.lite.Document@10.189}.changeListeners will be accessed at com.couchbase.lite.Document.revisionAdded(Document.java:598)
size : 0, ID : 8980450c-5ddb-4181-a7bf-3e162c67a68f
{com.couchbase.lite.Document@10.189}.changeListeners will be accessed at com.couchbase.lite.Document.revisionAdded(Document.java:598)
size : 0, ID : 8980450c-5ddb-4181-a7bf-3e162c67a68f
我们可以看到 removeChangeListener
从未被调用过,但 changeListeners
大小已设置为 0。
有人可以帮忙吗?
我没有找到发生这种情况的原因,但我设法通过 Database.ChangeListener 而不是 Document.ChangeListener 来侦听更改来解决此问题。当我调用 attachDocumentChangeListener(Document.ChangeListener)
时,我将侦听器添加到 Map<String,Document.ChangeListener>
(关键文档 ID 所在的位置),当更新文档时,它会通过 Database.ChangeListener.changed()
方法,下面是我重写的方法它:
@Override
public void changed(Database.ChangeEvent event) {
for (DocumentChange change : event.getChanges()) {
List<DocumentChangeListener> documentChangeListeners = this.documentChangeListeners.get(change.getDocumentId());
if(documentChangeListeners != null){
for (DocumentChangeListener changeListener : documentChangeListeners)
changeListener.changed(change);
}
}
}
这是我的两种方法 attachDocumentChangeListener()
和 detachDocumentChangeListener()
。
public void attachDocumentChangeListener(String documentId, final DocumentChangeListener listener){
List<DocumentChangeListener> documentChangeListeners = this.documentChangeListeners.get(documentId);
if(documentChangeListeners == null)
documentChangeListeners = new ArrayList<>();
documentChangeListeners.add(listener);
this.documentChangeListeners.put(documentId, documentChangeListeners);
}
public void detachDocumentChangeListener(@NonNull DocumentChangeListener listener){
String documentId = listener.getDocumentId();
List<DocumentChangeListener> documentChangeListeners = this.documentChangeListeners.get(documentId);
if(documentChangeListeners != null){
documentChangeListeners.remove(listener);
if(documentChangeListeners.isEmpty())
this.documentChangeListeners.remove(documentId);
else
this.documentChangeListeners.put(documentId, documentChangeListeners);
}
}
这 3 个方法都在单例中。
Document.ChangeListener
与 Document
实例关联。我相信以下事情可能会发生。
- 获取文档ID为
8980450c-5ddb-4181-a7bf-3e162c67a68f
的文档实例(Document@6.888)。
- 已将 Document.ChangeListener 添加到文档实例。
- 文档实例已发布(已收集垃圾)。
- 获取具有相同文档ID的文档实例(Document@9.975)。
- 但是这个实例没有Document.ChangeListener,无法通知变化。
我在 Android 中使用 Couchbase Lite。我有一份文件,我需要在上面添加一个 Document.ChangeListener(以便在该文件更改时更新 UI)。
我添加了它,但它似乎被删除了 "automagically",我不知道为什么。我有一个方法 "attachDocumentChangeListener" 我称之为:
public void attachDocumentChangeListener(String documentId, final DocumentChangeListener<TData> listener) {
getDefaultDatabase().getDocument(documentId).addChangeListener(listener);
}
我不再触摸我的设备,而是通过另一台设备对文档进行更新。这应该触发 ChangeEvent 但似乎没有发生。
我注意到当文档更新时,文档没有ChangeListener
(即使我之前添加了一个juste)。为了检查 ChangeListener
何时被删除,我在 Document
class 的函数 removeChangeListener(ChangeListener changeListener)
中添加了一个断点,但是从未调用过并且字段 changeListeners
是更新后还是空的
我添加了另一个断点,changeListeners
上的一个现场观察点。这是此断点配置的屏幕截图:
我重复了该操作(使用另一台设备更新文档),但除了显示 ChangeListener 的日志已被删除(不知道如何),我什么也没看到
{com.couchbase.lite.Document@6.888}.changeListeners will be accessed at com.couchbase.lite.Document.addChangeListener(Document.java:169)
size : 0, ID : 8980450c-5ddb-4181-a7bf-3e162c67a68f
{com.couchbase.lite.Document@6.888}.changeListeners will be accessed at com.couchbase.lite.Document.addChangeListener(Document.java:169)
size : 1, ID : 8980450c-5ddb-4181-a7bf-3e162c67a68f
{com.couchbase.lite.Document@9.975}.changeListeners will be accessed at com.couchbase.lite.Document.addChangeListener(Document.java:169)
size : 0, ID : 8980450c-5ddb-4181-a7bf-3e162c67a68f
{com.couchbase.lite.Document@10.189}.changeListeners will be accessed at com.couchbase.lite.Document.revisionAdded(Document.java:598)
size : 0, ID : 8980450c-5ddb-4181-a7bf-3e162c67a68f
{com.couchbase.lite.Document@10.189}.changeListeners will be accessed at com.couchbase.lite.Document.revisionAdded(Document.java:598)
size : 0, ID : 8980450c-5ddb-4181-a7bf-3e162c67a68f
我们可以看到 removeChangeListener
从未被调用过,但 changeListeners
大小已设置为 0。
有人可以帮忙吗?
我没有找到发生这种情况的原因,但我设法通过 Database.ChangeListener 而不是 Document.ChangeListener 来侦听更改来解决此问题。当我调用 attachDocumentChangeListener(Document.ChangeListener)
时,我将侦听器添加到 Map<String,Document.ChangeListener>
(关键文档 ID 所在的位置),当更新文档时,它会通过 Database.ChangeListener.changed()
方法,下面是我重写的方法它:
@Override
public void changed(Database.ChangeEvent event) {
for (DocumentChange change : event.getChanges()) {
List<DocumentChangeListener> documentChangeListeners = this.documentChangeListeners.get(change.getDocumentId());
if(documentChangeListeners != null){
for (DocumentChangeListener changeListener : documentChangeListeners)
changeListener.changed(change);
}
}
}
这是我的两种方法 attachDocumentChangeListener()
和 detachDocumentChangeListener()
。
public void attachDocumentChangeListener(String documentId, final DocumentChangeListener listener){
List<DocumentChangeListener> documentChangeListeners = this.documentChangeListeners.get(documentId);
if(documentChangeListeners == null)
documentChangeListeners = new ArrayList<>();
documentChangeListeners.add(listener);
this.documentChangeListeners.put(documentId, documentChangeListeners);
}
public void detachDocumentChangeListener(@NonNull DocumentChangeListener listener){
String documentId = listener.getDocumentId();
List<DocumentChangeListener> documentChangeListeners = this.documentChangeListeners.get(documentId);
if(documentChangeListeners != null){
documentChangeListeners.remove(listener);
if(documentChangeListeners.isEmpty())
this.documentChangeListeners.remove(documentId);
else
this.documentChangeListeners.put(documentId, documentChangeListeners);
}
}
这 3 个方法都在单例中。
Document.ChangeListener
与 Document
实例关联。我相信以下事情可能会发生。
- 获取文档ID为
8980450c-5ddb-4181-a7bf-3e162c67a68f
的文档实例(Document@6.888)。 - 已将 Document.ChangeListener 添加到文档实例。
- 文档实例已发布(已收集垃圾)。
- 获取具有相同文档ID的文档实例(Document@9.975)。
- 但是这个实例没有Document.ChangeListener,无法通知变化。