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(如果你在它 运行 时替换它)。
之前,我们使用以下代码,以确保只有一个唯一的工作人员被排队。在此期间,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(如果你在它 运行 时替换它)。