本文介绍了检查是否已经安排了 WorkManager的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我如何检查 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.KEEPExistingPeriodicWorkPolicy.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;
    }
    

    当它的某些任务是 RUNNINGENQUEUED 时,它将返回 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的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-21 10:14