2017-02-23 88 views
1

Я использую Couchbase Lite с Android. У меня есть документ, по которому мне нужно добавить Document.ChangeListener (для обновления пользовательского интерфейса при каждом изменении этого документа).Document.ChangeListener удалены в Couchbase Lite

Я добавляю его, но он кажется удаленным «автоматически», и я не могу понять, почему. У меня есть метод «attachDocumentChangeListener», что я называю:

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

Я не трогаю мое устройства больше, и я сделать обновление на документе с помощью другого устройства. Это должно вызвать ChangeEvent, но похоже, что этого не происходит.

Я заметил, что, когда документ обновлен, документ не имеет ChangeListener (даже если я добавил один раз раньше). Чтобы проверить, когда удаляется ChangeListener, я добавил точку останова для функции removeChangeListener(ChangeListener changeListener) из класса Document, но она никогда не вызывалась, а поле 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.ChangeListener связан с экземпляром Document. Я считаю, что после всего этого может случиться.

  1. Образ экземпляра документа (Документ@6.888) с документом ID 8980450c-5ddb-4181-a7bf-3e162c67a68f.
  2. Добавлен Document.ChangeListener в экземпляр документа.
  3. Выдан экземпляр экземпляра (собранный мусор).
  4. экземпляр экземпляра экземпляра ([email protected]) с тем же идентификатором документа.
  5. Но этот экземпляр не имеет Document.ChangeListener и не может сообщить об изменениях.
0

Я не узнал, почему это происходит, но мне удалось исправить эту проблему, прослушав изменения через Database.ChangeListener вместо Document.ChangeListener. Когда я называю attachDocumentChangeListener(Document.ChangeListener), я добавляю слушателя в Map<String,Document.ChangeListener> (где ключевой идентификатор документа), а также, когда документ обновляется, он проходит через метод 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.