检查是否已经安排了 WorkManager [英] Check if WorkManager is scheduled already

查看:36
本文介绍了检查是否已经安排了 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特定名称可以一次处于活动状态.例如,您可能只想要一个同步操作处于活动状态.如果有一个待处理,你可以选择让它运行或替换为您的新作品.

This method allows you to enqueue a uniquely-named PeriodicWorkRequest, where only one PeriodicWorkRequest of a particular name can be active at a time. For example, you may only want one sync operation to be active. If there is one pending, you can choose to let it run or replace it with your new work.

因此您无需担心作品的重复.

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 <1.0.0-alpha11)

    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的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆