2017-02-23 67 views
1

我正在使用Couchbase Lite与Android。我有一个文档,我需要添加一个Document.ChangeListener(在文档更改时更新UI)。Couchbase Lite中删除Document.ChangeListener

我添加它,但它似乎被“自动”删除,我找不到原因。我有一个方法“attachDocumentChangeListener”,我称之为:

public void attachDocumentChangeListener(String documentId, final DocumentChangeListener<TData> listener) { 
     getDefaultDatabase().getDocument(documentId).addChangeListener(listener); 
} 

我不碰我的设备了,我就通过其他设备的文件的更新。这应该触发ChangeEvent,但似乎不会发生。

我注意到当文档更新时,文档没有ChangeListener(即使我之前添加了一个合理的文档)。要检查ChangeListener何时被删除,我在Document类中为函数removeChangeListener(ChangeListener changeListener)添加了一个断点,但从未调用该断点,并且在更新修订时字段changeListeners仍为空。

我在changeListeners增加了另一个断点,一个实地观察点。下面是这个断点的配置的截图:

enter image description here

我反复操作(请使用其他设备的文件),但我没有看到任何东西,但,显示一个ChangeListener日志已被删除(不知道如何)

{[email protected]}.changeListeners will be accessed at com.couchbase.lite.Document.addChangeListener(Document.java:169) 
size : 0, ID : 8980450c-5ddb-4181-a7bf-3e162c67a68f 
{[email protected]}.changeListeners will be accessed at com.couchbase.lite.Document.addChangeListener(Document.java:169) 
size : 1, ID : 8980450c-5ddb-4181-a7bf-3e162c67a68f 
{[email protected]}.changeListeners will be accessed at com.couchbase.lite.Document.addChangeListener(Document.java:169) 
size : 0, ID : 8980450c-5ddb-4181-a7bf-3e162c67a68f 
{[email protected]}.changeListeners will be accessed at com.couchbase.lite.Document.revisionAdded(Document.java:598) 
size : 0, ID : 8980450c-5ddb-4181-a7bf-3e162c67a68f 
{[email protected]}.changeListeners will be accessed at com.couchbase.lite.Document.revisionAdded(Document.java:598) 
size : 0, ID : 8980450c-5ddb-4181-a7bf-3e162c67a68f 

我们可以看到,removeChangeListener从来没有被调用但changeListeners大小设置为0。

任何人都可以帮助吗?

回答

2

Document.ChangeListenerDocument实例相关联。我相信下面的事情可能会发生。

  1. 获取文档实例(Document @ 6.888),文档ID为8980450c-5ddb-4181-a7bf-3e162c67a68f
  2. 将Document.ChangeListener添加到文档实例。
  3. 文档实例被释放(垃圾收集)。
  4. 获取具有相同文档ID的文档实例(Document @ 9.975)。
  5. 但是这个实例没有Document.ChangeListener,并且无法通知更改。
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); 
     } 
    } 
} 

这里是我的2种方法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种方法都在Singleton中。