workManager.cancelAllWorkByTag(TAG) 对 workManager.enqueueUniqueWork(TAG, ...) 有影响吗?

Will workManager.cancelAllWorkByTag(TAG) has any effect on workManager.enqueueUniqueWork(TAG, ...)?

之前,我们使用以下代码,以确保只有一个唯一的工作人员被排队。在此期间,enqueueUniqueWork API 尚不可用。

private static void cancelSyncWorker() {
    WorkManager workManager = getWorkManager();
    workManager.cancelAllWorkByTag(SyncWorker.TAG);
}

public static void startSyncWorker() {
    cancelSyncWorker();

    OneTimeWorkRequest oneTimeWorkRequest =
            new OneTimeWorkRequest.Builder(SyncWorker.class)
                    .setInitialDelay(initialDelay, TimeUnit.MILLISECONDS)
                    .setBackoffCriteria(BackoffPolicy.LINEAR, SYNC_WORKER_BACKOFF_DELAY, TimeUnit.MILLISECONDS)
                    .addTag(SyncWorker.TAG)
                    .build();

    WorkManager workManager = getWorkManager();
    workManager.enqueue(oneTimeWorkRequest);
}

现在,我们想切换到 enqueueUniqueWork。我们打算使用下面的代码。

private static void cancelSyncWorker() {
    WorkManager workManager = getWorkManager();
    workManager.cancelAllWorkByTag(SyncWorker.TAG);
}

public static void startSyncWorker() {
    // Cancel the legacy worker queued using legacy workManager.enqueue. 
    // This code shall be removed after some time.
    cancelSyncWorker();

    OneTimeWorkRequest oneTimeWorkRequest =
            new OneTimeWorkRequest.Builder(SyncWorker.class)
                    .setInitialDelay(initialDelay, TimeUnit.MILLISECONDS)
                    .setBackoffCriteria(BackoffPolicy.LINEAR, SYNC_WORKER_BACKOFF_DELAY, TimeUnit.MILLISECONDS)
                    .addTag(SyncWorker.TAG)
                    .build();

    WorkManager workManager = getWorkManager();
    workManager.enqueueUniqueWork(
            SyncWorker.TAG,
            ExistingWorkPolicy.REPLACE,
            oneTimeWorkRequest
    );
}

注意,cancelSyncWorker 仍然存在,因为即使用户设备升级到新的应用程序代码,系统仍然有旧作业通过旧版排队 workManager.enqueue

enqueueUniqueWork的第一个参数是String uniqueWorkName

我想知道,调用 workManager.cancelAllWorkByTag(SyncWorker.TAG)workManager.enqueueUniqueWork(SyncWorker.TAG, ...) 有什么影响吗?

cancelAllWorkByTag(tagname) 取消与该标签关联的所有作业。如果他们共享相同的 TAG,则包括唯一工人。

在您的代码中,您应该添加不带 TAG 的独特作品,或者如果需要的话,添加不同的 TAG。还有一组额外的 API,您可以使用它来 observe/cancel 使用其唯一的工作人员名称来完成您的独特工作。

要处理独特的工作,请使用:

您的函数可以更新,删除 addTag 调用,成为:

public static void startSyncWorker() {
    // Cancel the legacy worker queued using legacy workManager.enqueue. 
    // This code shall be removed after some time.
    cancelSyncWorker();

    OneTimeWorkRequest oneTimeWorkRequest =
            new OneTimeWorkRequest.Builder(SyncWorker.class)
                    .setInitialDelay(initialDelay, TimeUnit.MILLISECONDS)
                    .setBackoffCriteria(BackoffPolicy.LINEAR, SYNC_WORKER_BACKOFF_DELAY, TimeUnit.MILLISECONDS)
                    .build();

    WorkManager workManager = getWorkManager();
    workManager.enqueueUniqueWork(
            SyncWorker.TAG,
            ExistingWorkPolicy.KEEP,  // Use REPLACE only if necessary, KEEP is less expensive
            oneTimeWorkRequest
    );
}

需要注意的一件事,如果没有特别的理由替换现有的工作人员,我正在使用 ExistingWorkPolicy.KEEP(不知道 what/how 你的工作人员同步数据很难确定这是否是行)。替换 worker 是一个更昂贵的操作,并且可以取消已经执行的 worker(如果你在它 运行 时替换它)。