问题描述
我如何检查 WorkManager
是否已被安排.
How can I check if WorkManager
is scheduled already.
这是我安排 WorkManager
的代码.
Here is my code that schedule WorkManager
.
public static void scheduleWork() {
PeriodicWorkRequest.Builder photoCheckBuilder =
new PeriodicWorkRequest.Builder(WorkManagerService.class, TIME_INTERVAL_IN_SECONDS,
TimeUnit.SECONDS);
PeriodicWorkRequest photoCheckWork = photoCheckBuilder.build();
WorkManager instance = WorkManager.getInstance();
if (instance != null) {
instance.enqueueUniquePeriodicWork("TAG", ExistingPeriodicWorkPolicy.KEEP , photoCheckWork);
}
}
我在 Application
类的 onCreate()
中调用 scheduleWork()
.即使我可以通过这种方法检查我的服务是否正在运行.但是如果 WorkManager 已经被安排在预定时间内消除不一致,我不想要它.
I call scheduleWork()
in onCreate()
of my Application
class.Even I can check my service is running or not by this method. But I don't want schedule WorkManager if it is already scheduled to remove inconsistency in scheduled time.
喜欢
if(!workManagerIsScheduled())
{
scheduleWork();
}
有什么解决办法吗?
推荐答案
更新
如果您仅仅因为不想重复工作而需要检查已经运行的工作管理器.您可以简单地使用 enqueueUniquePeriodicWork()
此方法允许您将唯一命名的PeriodicWorkRequest,其中只有一个 PeriodicWorkRequest特定名称可以一次处于活动状态.例如,您可能只想要一个同步操作处于活动状态.如果有一个待处理,你可以选择让它运行或替换为您的新作品.
因此您无需担心作品的重复.
So you don't need to worry about duplicacy about works.
workmanager.enqueueUniquePeriodicWork(TAG, ExistingPeriodicWorkPolicy.KEEP , photoCheckWork);
- 其中 TAG 是唯一名称,工作经理将通过该名称检查重复.
- 您可以选择
ExistingPeriodicWorkPolicy.KEEP
和ExistingPeriodicWorkPolicy.REPLACE
.
当我没有找到任何方法时,我创建了这个方法.
I created this method when I did not find any.
private boolean isWorkScheduled(String tag) {
WorkManager instance = WorkManager.getInstance();
ListenableFuture<List<WorkInfo>> statuses = instance.getWorkInfosByTag(tag);
try {
boolean running = false;
List<WorkInfo> workInfoList = statuses.get();
for (WorkInfo workInfo : workInfoList) {
WorkInfo.State state = workInfo.getState();
running = state == WorkInfo.State.RUNNING | state == WorkInfo.State.ENQUEUED;
}
return running;
} catch (ExecutionException e) {
e.printStackTrace();
return false;
} catch (InterruptedException e) {
e.printStackTrace();
return false;
}
}
if (your_work_manager.version
private boolean isWorkScheduled(String tag) {
WorkManager instance = WorkManager.getInstance();
LiveData<List<WorkStatus>> statuses = instance.getStatusesByTag(tag);
if (statuses.getValue() == null) return false;
boolean running = false;
for (WorkStatus workStatus : statuses.getValue()) {
running = workStatus.getState() == State.RUNNING | workStatus.getState() == State.ENQUEUED;
}
return running;
}
当它的某些任务是 RUNNING
或 ENQUEUED 时,它将返回
.true
It will return true
when some of its task is RUNNING
or ENQUEUED
.
public static final String TAG_MY_WORK = "mywork";
if(!isWorkScheduled(TAG_MY_WORK)) { // check if your work is not already scheduled
scheduleWork(TAG_MY_WORK); // schedule your work
}
public static void scheduleWork(String tag) {
PeriodicWorkRequest.Builder photoCheckBuilder =
new PeriodicWorkRequest.Builder(WorkManagerService.class, TIME_INTERVAL_IN_SECONDS,
TimeUnit.SECONDS);
PeriodicWorkRequest photoCheckWork = photoCheckBuilder.build();
WorkManager instance = WorkManager.getInstance();
instance.enqueueUniquePeriodicWork(tag, ExistingPeriodicWorkPolicy.KEEP , photoCheckWork);
}
这篇关于检查是否已经安排了 WorkManager的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!