监控 CouchDB 上的复制过程

Monitoring the replication process on CouchDB

我在 Android 上有一个 CouchDBcouchbase-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 中找到代码的更多背景和讨论。