监控 CouchDB 上的复制过程
Monitoring the replication process on CouchDB
我在 Android
上有一个 CouchDB
和 couchbase-lite
的项目。
我有一个 Activitiy
,比方说 ReplicationActivity,我在其中显示 ProgressDialog
而复制过程 运行,这个过程使用大约 2 小时。
我的计划是在复制过程完成后,应用将用户移至 MainActivity。
我遇到的问题是应用程序在进程完成之前移动到 MainActivity,所以我没有 MainActivity 上可用的所有数据
为了监控复制过程,我这样做了:
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");
}
知道我该怎么做才能知道复制过程何时完成吗?
您想查看传递给侦听器的 ChangeEvent
对象。
下面是一个关于如何检测复制完成的示例:
// 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));
}
您可以在 this blog 中找到代码的更多背景和讨论。
我在 Android
上有一个 CouchDB
和 couchbase-lite
的项目。
我有一个 Activitiy
,比方说 ReplicationActivity,我在其中显示 ProgressDialog
而复制过程 运行,这个过程使用大约 2 小时。
我的计划是在复制过程完成后,应用将用户移至 MainActivity。
我遇到的问题是应用程序在进程完成之前移动到 MainActivity,所以我没有 MainActivity 上可用的所有数据
为了监控复制过程,我这样做了:
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");
}
知道我该怎么做才能知道复制过程何时完成吗?
您想查看传递给侦听器的 ChangeEvent
对象。
下面是一个关于如何检测复制完成的示例:
// 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));
}
您可以在 this blog 中找到代码的更多背景和讨论。