2017-02-23 2 views
1

저는 Android에서 Couchbase Lite를 사용하고 있습니다. Document.ChangeListener (이 문서가 변경 될 때마다 UI를 업데이트하기 위해)를 추가해야하는 문서가 있습니다.Document.ChangeListener가 Couchbase Lite에서 제거되었습니다

나는 그것을 추가하지만 "자동적으로"제거 된 것으로 보이며 나는 그 이유를 알 수 없다. 내가 전화하는 방법 "attachDocumentChangeListener"이 있습니다

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

난 더 이상 내 장치를 만지지 마십시오과 나는 또 다른 장치를 통해 문서에 대한 업데이 트를합니다. 이것은 ChangeEvent를 트리거해야하지만 발생하지는 않습니다.

문서가 업데이트되면 문서에 ChangeListener이 없습니다 (이전에 하나의 juste를 추가 한 경우에도 있음). 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.ChangeListenerDocument 인스턴스와 연관됩니다. 나는 다음 일이 일어날 수 있다고 생각한다.

  1. 문서 ID가 8980450c-5ddb-4181-a7bf-3e162c67a68f 인 문서 인스턴스 ([email protected])를 확보하십시오.
  2. 문서 인스턴스에 Document.ChangeListener를 추가했습니다.
  3. 문서 인스턴스가 해제됩니다 (가비지 수집).
  4. 동일한 문서 ID로 문서 인스턴스 ([email protected]9.975)를 가져옵니다.
  5. 그러나이 인스턴스에는 Document.ChangeListener가 없으므로 변경 사항을 알릴 수 없습니다.
0

왜 이런 일이 발생했는지 알 수는 없지만 Document.ChangeListener 대신 Database.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 가지 방법은 싱글 톤 내부에 있습니다.

관련 문제