使用WorkManager定期每日工作请求

时间:2018-05-15 18:32:37

标签: android android-architecture-components android-jetpack android-workmanager

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

我的想法是使用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的{​​{1}}方法中放置一个断点(所以它肯定在进行中),并检查另一个的工作状态线程。

3 个答案:

答案 0 :(得分:11)

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

答案 1 :(得分:2)

您正在寻找enqueueUniquePeriodicWork

  

此方法允许您排队唯一命名的   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

  

保持

     

如果存在具有相同唯一名称的待处理作品,请执行   什么都没有。

     

REPLACE

     

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

答案 2 :(得分:1)

最后,我明白,问题在于如何使用LiveData。因为没有观察者,所以内部没有价值。

仅使用PeriodicWork的问题在于它无法确保您想要完成的工作的唯一性。换句话说,可以让许多作品同时激活多次,而不是你需要的。