检查 WorkRequest 之前是否已被 WorkManager 查询 Android
Check if WorkRequest has been previously enquequed by WorkManager Android
我正在使用 PeriodicWorkRequest 每 15 分钟为我执行一次任务。
我想检查一下,如果这个定期工作请求之前已经安排好了。如果没有,请安排。
if (!PreviouslyScheduled) {
PeriodicWorkRequest dataupdate = new PeriodicWorkRequest.Builder( DataUpdateWorker.class , 15 , TimeUnit.MINUTES).build();
WorkManager.getInstance().enqueue(dataupdate);
}
之前使用JobScheduler执行任务时,我习惯使用
public static boolean isJobServiceScheduled(Context context, int JOB_ID ) {
JobScheduler scheduler = (JobScheduler) context.getSystemService( Context.JOB_SCHEDULER_SERVICE ) ;
boolean hasBeenScheduled = false ;
for ( JobInfo jobInfo : scheduler.getAllPendingJobs() ) {
if ( jobInfo.getId() == JOB_ID ) {
hasBeenScheduled = true ;
break ;
}
}
return hasBeenScheduled ;
}
需要帮助构建类似的工作请求模块以帮助查找 scheduled/active 工作请求。
我也在搜索相同的 condition.I 找不到 one.So 为了解决这个问题我发现 mechanism.First 取消所有预定的工作并重新安排工作。这样我们就可以确保只维护您工作的一个实例。另外请确保您必须像那样维护您的工作代码逻辑。
用于取消工作。对于 more
UUID compressionWorkId = compressionWork.getId();
WorkManager.getInstance().cancelWorkById(compressionWorkId);
您需要为每个 WorkRequest 添加一个唯一的标签。检查 Tagged work.
您可以通过将标记字符串分配给任何 WorkRequest 对象来对您的任务进行逻辑分组。为此,您需要致电 WorkRequest.Builder.addTag()
检查下面的 Android 文档示例:
OneTimeWorkRequest cacheCleanupTask =
new OneTimeWorkRequest.Builder(MyCacheCleanupWorker.class)
.setConstraints(myConstraints)
.addTag("cleanup")
.build();
同样可以用于 PeriodicWorkRequest
然后,您将使用 WorkManager.getStatusesByTag()
.
获得带有该标签的所有任务的所有工作状态列表
这会为您提供 LiveData
list of WorkStatus
带有标签的作品。
然后您可以使用 WorkStatus 查看状态,如下所示:
WorkStatus workStatus = listOfWorkStatuses.get(0);
boolean finished = workStatus.getState().isFinished();
if (!finished) {
// Work InProgress
} else {
// Work Finished
}
您可以查看下面的 google 示例了解更多详情。他们在这里添加了如何向 WorkRequest 添加标签并通过标签获取工作状态:
https://github.com/googlecodelabs/android-workmanager
编辑
检查下面的代码并评论我们如何通过标签获取 WorkStatus。如果 WorkStatus 结果为空,则安排我们的工作。
// Check work status by TAG
WorkManager.getInstance().getStatusesByTag("[TAG_STRING]").observe(this, listOfWorkStatuses -> {
// Note that we will get single WorkStatus if any tag (here [TAG_STRING]) related Work exists
// If there are no matching work statuses
// then we make sure that periodic work request has been previously not scheduled
if (listOfWorkStatuses == null || listOfWorkStatuses.isEmpty()) {
// we can schedule our WorkRequest here
PeriodicWorkRequest dataupdate = new PeriodicWorkRequest.Builder( DataUpdateWorker.class , 15 , TimeUnit.MINUTES)
.addTag("[TAG_STRING]")
.build();
WorkManager.getInstance().enqueue(dataupdate);
return;
}
WorkStatus workStatus = listOfWorkStatuses.get(0);
boolean finished = workStatus.getState().isFinished();
if (!finished) {
// Work InProgress
} else {
// Work Finished
}
});
我没有测试代码。请提供您的反馈意见。
希望对您有所帮助。
为您的 PeriodicWorkRequest 任务设置一些标签:
PeriodicWorkRequest work =
new PeriodicWorkRequest.Builder(DataUpdateWorker.class, 15, TimeUnit.MINUTES)
.addTag(TAG)
.build();
然后在 enqueue() 工作之前使用 TAG 检查任务:
WorkManager wm = WorkManager.getInstance();
ListenableFuture<List<WorkStatus>> future = wm.getStatusesByTag(TAG);
List<WorkStatus> list = future.get();
// start only if no such tasks present
if((list == null) || (list.size() == 0)){
// shedule the task
wm.enqueue(work);
} else {
// this periodic task has been previously scheduled
}
但如果您真的不需要知道它是否已预先安排,您可以使用:
static final String TASK_ID = "data_update"; // some unique string id for the task
PeriodicWorkRequest work =
new PeriodicWorkRequest.Builder(DataUpdateWorker.class,
15, TimeUnit.MINUTES)
.build();
WorkManager.getInstance().enqueueUniquePeriodicWork(TASK_ID,
ExistingPeriodicWorkPolicy.KEEP, work);
ExistingPeriodicWorkPolicy.KEEP 表示任务只会被安排一次,然后即使在设备重启后也会定期工作。如果您需要重新安排任务(例如,如果您需要更改任务的某些参数),则需要在此处使用 ExistingPeriodicWorkPolicy.REPLACE
与 ExistingPeriodicWorkPolicy.KEEP
保持相同的任务 ID 不会每次都创建新任务。
WorkManager.getInstance().enqueueUniquePeriodicWork(TASK_ID,
ExistingPeriodicWorkPolicy.KEEP, work);
我正在使用 PeriodicWorkRequest 每 15 分钟为我执行一次任务。 我想检查一下,如果这个定期工作请求之前已经安排好了。如果没有,请安排。
if (!PreviouslyScheduled) {
PeriodicWorkRequest dataupdate = new PeriodicWorkRequest.Builder( DataUpdateWorker.class , 15 , TimeUnit.MINUTES).build();
WorkManager.getInstance().enqueue(dataupdate);
}
之前使用JobScheduler执行任务时,我习惯使用
public static boolean isJobServiceScheduled(Context context, int JOB_ID ) {
JobScheduler scheduler = (JobScheduler) context.getSystemService( Context.JOB_SCHEDULER_SERVICE ) ;
boolean hasBeenScheduled = false ;
for ( JobInfo jobInfo : scheduler.getAllPendingJobs() ) {
if ( jobInfo.getId() == JOB_ID ) {
hasBeenScheduled = true ;
break ;
}
}
return hasBeenScheduled ;
}
需要帮助构建类似的工作请求模块以帮助查找 scheduled/active 工作请求。
我也在搜索相同的 condition.I 找不到 one.So 为了解决这个问题我发现 mechanism.First 取消所有预定的工作并重新安排工作。这样我们就可以确保只维护您工作的一个实例。另外请确保您必须像那样维护您的工作代码逻辑。
用于取消工作。对于 more
UUID compressionWorkId = compressionWork.getId();
WorkManager.getInstance().cancelWorkById(compressionWorkId);
您需要为每个 WorkRequest 添加一个唯一的标签。检查 Tagged work.
您可以通过将标记字符串分配给任何 WorkRequest 对象来对您的任务进行逻辑分组。为此,您需要致电 WorkRequest.Builder.addTag()
检查下面的 Android 文档示例:
OneTimeWorkRequest cacheCleanupTask =
new OneTimeWorkRequest.Builder(MyCacheCleanupWorker.class)
.setConstraints(myConstraints)
.addTag("cleanup")
.build();
同样可以用于 PeriodicWorkRequest
然后,您将使用 WorkManager.getStatusesByTag()
.
这会为您提供 LiveData
list of WorkStatus
带有标签的作品。
然后您可以使用 WorkStatus 查看状态,如下所示:
WorkStatus workStatus = listOfWorkStatuses.get(0);
boolean finished = workStatus.getState().isFinished();
if (!finished) {
// Work InProgress
} else {
// Work Finished
}
您可以查看下面的 google 示例了解更多详情。他们在这里添加了如何向 WorkRequest 添加标签并通过标签获取工作状态:
https://github.com/googlecodelabs/android-workmanager
编辑 检查下面的代码并评论我们如何通过标签获取 WorkStatus。如果 WorkStatus 结果为空,则安排我们的工作。
// Check work status by TAG
WorkManager.getInstance().getStatusesByTag("[TAG_STRING]").observe(this, listOfWorkStatuses -> {
// Note that we will get single WorkStatus if any tag (here [TAG_STRING]) related Work exists
// If there are no matching work statuses
// then we make sure that periodic work request has been previously not scheduled
if (listOfWorkStatuses == null || listOfWorkStatuses.isEmpty()) {
// we can schedule our WorkRequest here
PeriodicWorkRequest dataupdate = new PeriodicWorkRequest.Builder( DataUpdateWorker.class , 15 , TimeUnit.MINUTES)
.addTag("[TAG_STRING]")
.build();
WorkManager.getInstance().enqueue(dataupdate);
return;
}
WorkStatus workStatus = listOfWorkStatuses.get(0);
boolean finished = workStatus.getState().isFinished();
if (!finished) {
// Work InProgress
} else {
// Work Finished
}
});
我没有测试代码。请提供您的反馈意见。
希望对您有所帮助。
为您的 PeriodicWorkRequest 任务设置一些标签:
PeriodicWorkRequest work =
new PeriodicWorkRequest.Builder(DataUpdateWorker.class, 15, TimeUnit.MINUTES)
.addTag(TAG)
.build();
然后在 enqueue() 工作之前使用 TAG 检查任务:
WorkManager wm = WorkManager.getInstance();
ListenableFuture<List<WorkStatus>> future = wm.getStatusesByTag(TAG);
List<WorkStatus> list = future.get();
// start only if no such tasks present
if((list == null) || (list.size() == 0)){
// shedule the task
wm.enqueue(work);
} else {
// this periodic task has been previously scheduled
}
但如果您真的不需要知道它是否已预先安排,您可以使用:
static final String TASK_ID = "data_update"; // some unique string id for the task
PeriodicWorkRequest work =
new PeriodicWorkRequest.Builder(DataUpdateWorker.class,
15, TimeUnit.MINUTES)
.build();
WorkManager.getInstance().enqueueUniquePeriodicWork(TASK_ID,
ExistingPeriodicWorkPolicy.KEEP, work);
ExistingPeriodicWorkPolicy.KEEP 表示任务只会被安排一次,然后即使在设备重启后也会定期工作。如果您需要重新安排任务(例如,如果您需要更改任务的某些参数),则需要在此处使用 ExistingPeriodicWorkPolicy.REPLACE
与 ExistingPeriodicWorkPolicy.KEEP
保持相同的任务 ID 不会每次都创建新任务。
WorkManager.getInstance().enqueueUniquePeriodicWork(TASK_ID,
ExistingPeriodicWorkPolicy.KEEP, work);