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.ChangeListenerDocument 实例关联。我相信以下事情可能会发生。

  1. 获取文档ID为8980450c-5ddb-4181-a7bf-3e162c67a68f的文档实例(Document@6.888)。
  2. 已将 Document.ChangeListener 添加到文档实例。
  3. 文档实例已发布(已收集垃圾)。
  4. 获取具有相同文档ID的文档实例(Document@9.975)。
  5. 但是这个实例没有Document.ChangeListener,无法通知变化。