Android Document.ChangeListener在Couchbase Lite中被删除
我用的是Couchbase Lite和Android。我有一个文档,需要在其上添加document.ChangeListener(以便在该文档更改时更新UI) 我添加了它,但它似乎是“自动”删除的,我不知道为什么。我调用了一个方法“attachDocumentChangeListener”: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
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)带文档ID8980450c-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);
}
}