Reputation: 2483
I have a project with CouchDB
and couchbase-lite
on Android
.
I have an Activitiy
,lets say ReplicationActivity, where I am showing a ProgressDialog
while the replication process run, this process uses around 2 hours.
My plan is when the replication process is finished the app moves the user to the MainActivity.
The problem I have is that the app moves to MainActivity before the process is finished, so I have not all the data available on MainActivity
In order to monitoring the replication process I am doing this:
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");
}
Any idea about what I can do in order to know the when replication process is finished?
Upvotes: 0
Views: 84
Reputation: 2276
You want to look at the ChangeEvent
object passed to the listener.
Here's an example on how to detect a replication finishing:
// 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));
}
You can find more background and discussion of the code in this blog.
Upvotes: 1