使用WorkManager定期每日工作请求

Gak*_*ket 10 android android-architecture-components android-jetpack android-workmanager

如何正确使用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);
}
Run Code Online (Sandbox Code Playgroud)

value总是空,即使我把一个断点里面WorkerdoWork()方法(所以它肯定是正在进行中),并从另一个线程检查工作状态.

Khe*_*raj 13

您正在寻找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);
}
Run Code Online (Sandbox Code Playgroud)

你得到两种类型的ExistingPeriodicWorkPolicy

保持

如果存在具有相同唯一名称的现有待处理工作,则不执行任何操作。

代替

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


Gre*_*Dan 11

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