0

以前,我们使用以下代码,以确保只有一个唯一的工作人员被排队。在此期间,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

的第一个参数enqueueUniqueWorkString uniqueWorkName

我想知道,打电话workManager.cancelAllWorkByTag(SyncWorker.TAG)会影响workManager.enqueueUniqueWork(SyncWorker.TAG, ...)吗?

4

1 回答 1

1

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

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

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

您的功能可以更新,删除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(不知道你的工作人员同步数据的内容/方式,很难确定这是否可以)。更换工作人员是一项更昂贵的操作,并且可能会取消已经执行的工作人员(如果您在其运行时更换它)。

于 2019-10-29T17:07:30.453 回答