2017-08-25 47 views
0

我有一個CouchDB,我通過CouchBaseLite 1.4連接。在繼續執行應用程序之前,我無法等待所有文檔被拖動。CouchbaseLite等待pull複製完成

目前我正以非常冒險的方式實現這一目標,並且我想根據適當的編碼標準來修正它。

電流:

pull.setContinuous(false); 
pull.start(); 

//Waits for pull replication to start pulling in data 
while(!pull.isRunning()); 

//Waits for pull replication to finish. 
while(!pull.getStatus().equals(Replication.ReplicationStatus.REPLICATION_STOPPED)); 

//Set continuous to true 
pull.setContinuous(true); 

//Start it again. 
pull.start(); 

的原因,我這樣做是我可能必須在DB 2個文件,我需要等待,如果它們不存在的桌面應用程序,進入設置模式。

  • 有沒有辦法等待所有文件完成拉 沒有哈克雙while
  • 更好的是,讓我們假設我知道_id的文檔。在繼續之前是否有辦法等到BOTH被拉出?

回答

1

使用更改偵聽器。要監視複製,你要像

// Replication.ChangeListener 
@Override 
public void changed(Replication.ChangeEvent changeEvent) { 
    if (changeEvent.getError() != null) { 
    Throwable lastError = changeEvent.getError(); 
    // React to the error 
    return; 
    } 

    if (changeEvent.getTransition() == null) return; 

    ReplicationState dest = changeEvent.getTransition().getDestination(); 

    replicationActive = ((dest == ReplicationState.STOPPING || dest == ReplicationState.STOPPED) ? false : true); 

    // Do something here if true 
} 

你可以做與數據庫對象的更改偵聽器,當兩個特定的文件已複製到趕上類似的東西。

因爲它聽起來就像你希望這些文檔是在初始設置其他地方後,數據庫,另一種方法是做一錘子複製得到的頭文件,然後開始連續複製它後完了。

+0

這並不完全解決我的問題,因爲'changeListener'不會阻止我的主線程運行。我採用了第二個建議,並使用一次性複製來抓取這兩個文檔。它現在運行速度明顯加快。儘管我仍然使用了double,但我只是在等待兩個文檔,因此即使代碼很醜,暫停也很少且可以接受。 –

+0

啊,是的,我通常會以無阻塞的方式思考。還有其他一些想法:通過回調中的調用來獲取主執行,或者讓線程進入休眠狀態並從回調中發出信號? – Hod