2017-08-25 17 views
0

私はCouchDBaseLite 1.4経由で接続しているCouchDBを持っています。私は、アプリケーションを続行する前に、すべてのドキュメントが引っ張られるのを待つのに問題があります。CouchbaseLiteはプルレプリケーションが完了するまで待ちます

現在、私は非常にハッキーな方法でこれを達成しており、適切なコーディング基準に沿って改善するように修正したいと考えています。

電流:

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を知っていると仮定してください。続行する前に両方が引かれるまで待つ方法はありますか?

答えて

1

変更リスナーを使用します。レプリケーションを監視するには、次の2つの特定の文書が複製されていたときにキャッチするために、データベース・オブジェクトに変更リスナーと似た何かができる

// 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'がメインスレッドの実行を止めないので、これは私の問題を正確に解決しません。私はあなたの2番目の提案に行き、ワンショット複製を使用して2つのドキュメントを取得しました。今すぐ目に見えるほど速く走ります。私はまだ二重引用符を使用していましたが、私は2つのドキュメントを待っているだけなので、コードが醜い場合でも一時停止は最小限で容認できます。 –

+0

ああ、私は通常、ノンブロッキングの言葉で考える。他にもいくつかの考えがあります:コールバックでコールを介してメイン実行を取り出すか、スレッドをスリープ状態にしてコールバックから通知しますか? – Hod

関連する問題