避免在WorkManager中重复调用PeriodicWorkRequest

16
在应用程序启动时,我希望启动一个永久运行的服务,但当用户再次打开应用程序时,会出现重复的情况。
PeriodicWorkRequest.Builder sendDataBuilder = new PeriodicWorkRequest.Builder(SendConnectionMetricsWorker.class, Constants.REPEAT_TIME_INTERVAL_IN_HOURS, Constants.REPEAT_TIME_INTERVAL_UNITS)
                .setConstraints(new Constraints.Builder()
                        .setRequiredNetworkType(NetworkType.CONNECTED)
                        .build());
        PeriodicWorkRequest periodicWorkRequest = sendDataBuilder
                .build();
        WorkManager.getInstance().enqueue(periodicWorkRequest);
1个回答

42

你可以使用enqueueUniquePeriodicWork代替enqueue。根据文档:

此方法允许您将具有唯一名称的PeriodicWorkRequest排队,一个特定名称的PeriodicWorkRequest最多只能同时处于活动状态。例如,您可能只希望一个同步操作处于活动状态。如果有一个挂起,您可以选择让它运行或使用您的新工作替换它。uniqueWorkName唯一地标识此PeriodicWorkRequest。

你可以按照以下方式实现:

PeriodicWorkRequest.Builder sendDataBuilder = new PeriodicWorkRequest.Builder(SendConnectionMetricsWorker.class, Constants.REPEAT_TIME_INTERVAL_IN_HOURS, Constants.REPEAT_TIME_INTERVAL_UNITS)
                .setConstraints(new Constraints.Builder()
                        .setRequiredNetworkType(NetworkType.CONNECTED)
                        .build());
 PeriodicWorkRequest periodicWorkRequest = sendDataBuilder
                .build();
 WorkManager.getInstance().enqueueUniquePeriodicWork("Send Data",  ExistingPeriodicWorkPolicy.KEEP,periodicWorkRequest);

注意:

ExistingPeriodicWorkPolicy.REPLACE 确保如果存在带有 uniqueWorkName 标签的挂起任务,它将被取消并且新任务将运行。 ExistingPeriodicWorkPolicy.KEEP 只有在没有带有 uniqueWorkName 标签的挂起任务时才会运行新的 PeriodicWorkRequest。


谢谢,我之前在alpha02上,它的API不同。 - Igor Kostenko
@Sagar,有了这个新的enqueueUniquePeriodicWork,我们不再需要检查workstatus和观察liveData事件了,对吧? - Nicolas Jafelle
@Sagar 我正在做这个: WorkManager.getInstance().enqueueUniquePeriodicWork(TAG, ExistingPeriodicWorkPolicy.KEEP, sendMessageWork);所以,如果已经安排了一个具有该唯一名称TAG的定期工作程序,那么workmanager将简单地忽略未来的enqueueUniquePeriodicWork,对吗?除非我用REPLACE替换KEEP。 - Nicolas Jafelle
2
我的“enqueueUniquePeriodicWork”仅在一些时间内正常工作(同步数据)。之后它不再同步,即使使用KEEP或REPLACE策略,也没有任何约束... 有什么想法吗? - Dan Alboteanu
@DanAlboteanu 如果您解决了这个问题,我也有同样的问题:https://stackoverflow.com/questions/68259689/workmanager-periodic-work-is-not-running-periodically - Daniel Wilson
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接