以前,我们使用以下代码,以确保只有一个唯一的工作人员被排队。在此期间,enqueueUniqueWorkAPI 尚不可用。
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仍然存在,因为即使用户设备升级到新的应用程序代码,系统仍然有旧作业,它通过 legacy 排队workManager.enqueue
的第一个参数enqueueUniqueWork是String uniqueWorkName。
我想知道,打电话workManager.cancelAllWorkByTag(SyncWorker.TAG)会影响workManager.enqueueUniqueWork(SyncWorker.TAG, ...)吗?