2017-06-20 1 views
0

Ich habe ein Projekt mit CouchDB und couchbase-lite auf Android. Ich habe eine Activitiy, sagen wir ReplicationActivity, wo ich eine ProgressDialog zeigen, während der Replikationsvorgang ausgeführt wird, dauert dieser Prozess etwa 2 Stunden. Mein Plan ist, wenn der Replikationsprozess abgeschlossen ist, bewegt die App den Benutzer zu MainActivity.
Das Problem I haben, dass die App bewegt zu MainActivity vor dem Prozess ist abgeschlossen, so dass ich nicht alle verfügbaren Daten über MainActivityÜberwachung des Replikationsprozesses auf CouchDB

Um den Replikationsprozess zu überwachen Ich tue dies:

CouchbaseManager.getInstance().addProgressListener(new Replication.ChangeListener() { 
     @Override 
     public void changed(Replication.ChangeEvent event) { 

      if (CouchbaseManager.getInstance().getReplicationProgress() > 0 && 
        CouchbaseManager.getInstance().getReplicationTotal() > 0 && 
        CouchbaseManager.getInstance().getReplicationTotal() == 
        CouchbaseManager.getInstance().getReplicationProgress() && 
        CouchbaseManager.getInstance().getPullwork().getStatus() != 
          Replication.ReplicationStatus.REPLICATION_ACTIVE && 
        CouchbaseManager.getInstance().getPushwork().getStatus() != 
          Replication.ReplicationStatus.REPLICATION_ACTIVE && 
        CouchbaseManager.getInstance().getPullmaster().getStatus() != 
          Replication.ReplicationStatus.REPLICATION_ACTIVE) { 
       if (mProgressDialog != null && mProgressDialog.isShowing()) { 
        mProgressDialog.dismiss(); 
        Log.i("usercontroller", "MOVING TO MAIN ACTIVITY"); 


       } 

Irgendeine Idee darüber, was ich tun kann, um zu wissen, wann der Replikationsprozess beendet ist?

Antwort

1

Sie möchten das Objekt ChangeEvent betrachten, das an den Listener übergeben wurde.

Hier ist ein Beispiel dafür, wie eine Replikationsweiterverarbeitung erkennen:

// 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); 

    stateListeners.forEach(listener -> listener.onChange(replicationActive)); 
} 

Sie können in this blog mehr Hintergrund und Diskussion des Codes finden.