16

如何正确使用WorkManagerAndroid Jetpack 中的新功能来安排每天一次的定期工作,该工作应该每天并且恰好一次执行一些操作?

想法是检查具有给定标签的工作是否已经存在WorkManager,否则开始新的定期工作。

我尝试使用下一种方法来做到这一点:

public static final String CALL_INFO_WORKER = "Call worker";

...

WorkManager workManager = WorkManager.getInstance();
List<WorkStatus> value = workManager.getStatusesByTag(CALL_INFO_WORKER).getValue();
if (value == null) {
    WorkRequest callDataRequest = new PeriodicWorkRequest.Builder(CallInfoWorker.class,
                24, TimeUnit.HOURS, 3, TimeUnit.HOURS)
                .addTag(CALL_INFO_WORKER)
                .build();
    workManager.enqueue(callDataRequest);
}

value始终为空,即使我在Worker'doWork()方法中放置了一个断点(所以它肯定在进行中)并从另一个线程检查工作状态。

4

3 回答 3

17

您现在可以使用enqueueUniquePeriodicWork方法。它是在 WorkManager 的 1.0.0-alpha03 版本中添加的。

于 2018-06-26T15:53:52.410 回答
15

您正在寻找enqueueUniquePeriodicWork

此方法允许您将唯一命名的PeriodicWorkRequest排入队列 ,其中一次只能激活一个特定名称的 PeriodicWorkRequest。例如,您可能只希望一个同步操作处于活动状态。如果有一个待处理,您可以选择让它运行或用您的新工作替换它。

示例代码

public static final String TAG_MY_WORK = "mywork";

public static void scheduleWork(String tag) {
    PeriodicWorkRequest.Builder photoCheckBuilder =
            new PeriodicWorkRequest.Builder(WorkManagerService.class, 1, TimeUnit.DAYS);
    PeriodicWorkRequest request = photoCheckBuilder.build();
    WorkManager.getInstance().enqueueUniquePeriodicWork(tag, ExistingPeriodicWorkPolicy.KEEP , request);
}

你得到两种类型的ExistingPeriodicWorkPolicy

保持

如果存在具有相同唯一名称的现有待处理工作,则什么也不做。

代替

如果存在具有相同唯一名称的现有待处理工作,请取消并删除它。

于 2018-11-22T19:54:16.937 回答
1

最终,我明白了,问题在于如何LiveData使用它。因为没有观察者,所以里面没有价值。

仅使用 the 的问题PeriodicWork在于它不能确保您想做的工作的唯一性。换句话说,有可能有许多作品同时激活的次数超出您的需要。

于 2018-05-15T19:16:15.657 回答