Android Document.ChangeListener在Couchbase Lite中被删除

Android Document.ChangeListener在Couchbase Lite中被删除,android,couchbase,couchbase-lite,changelistener,Android,Couchbase,Couchbase Lite,Changelistener,我用的是Couchbase Lite和Android。我有一个文档,需要在其上添加document.ChangeListener(以便在该文档更改时更新UI) 我添加了它,但它似乎是“自动”删除的,我不知道为什么。我调用了一个方法“attachDocumentChangeListener”: public void attachDocumentChangeListener(String documentId, final DocumentChangeListener<TData> l

我用的是Couchbase Lite和Android。我有一个文档,需要在其上添加document.ChangeListener(以便在该文档更改时更新UI)

我添加了它,但它似乎是“自动”删除的,我不知道为什么。我调用了一个方法“attachDocumentChangeListener”:

public void attachDocumentChangeListener(String documentId, final DocumentChangeListener<TData> listener) {
       getDefaultDatabase().getDocument(documentId).addChangeListener(listener);
}
我们可以看到,从未调用过
removeChangeListener
,但
changeListeners
size已设置为0


有人可以帮忙吗?

我不知道为什么会发生这种情况,但我通过Database.ChangeListener而不是Document.ChangeListener监听更改,成功地解决了这个问题。当我调用
attachDocumentChangeListener(Document.changeStener)
时,我将侦听器添加到
映射中(其中包含关键文档id),当文档更新时,它将通过
数据库.changeStener.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);
        }
    }
}

这三个方法都在一个单例中。

文档。ChangeListener
文档
实例相关联。我相信会发生以下事情

  • 获取文档实例(Document@6.888)带文档ID
    8980450c-5ddb-4181-a7bf-3e162c67a68f
  • 已将Document.ChangeListener添加到文档实例
  • 文档实例被释放(垃圾回收)
  • 获取文档实例(Document@9.975)具有相同的文档ID
  • 但此实例没有Document.ChangeListener,无法通知更改
  • @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);
            }
        }
    }
    
    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);
        }
    }