如何正确使用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}}方法中放置一个断点(所以它肯定在进行中),并检查另一个的工作状态线程。
答案 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
的问题在于它无法确保您想要完成的工作的唯一性。换句话说,可以让许多作品同时激活多次,而不是你需要的。