代码之家  ›  专栏  ›  技术社区  ›  Khemraj Sharma

检查是否已安排WorkManager

  •  4
  • Khemraj Sharma  · 技术社区  · 7 年前

    我怎么检查 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);
        }
    }
    

    我打电话 scheduleWork() 在里面 onCreate() 我的 Application 班级。 即使我可以检查我的服务是否正在运行 this method . 但我不希望调度WorkManager在调度时间内消除不一致。

    喜欢

    if(!workManagerIsScheduled())
       {
         scheduleWork();
       }
    

    有什么解决办法吗?

    3 回复  |  直到 6 年前
        1
  •  31
  •   Khemraj Sharma    6 年前

    enqueueUniquePeriodicWork()

     workmanager.enqueueUniquePeriodicWork(TAG, ExistingPeriodicWorkPolicy.KEEP , photoCheckWork);
    
    • choose between ExistingPeriodicWorkPolicy.KEEP ExistingPeriodicWorkPolicy.REPLACE

    if (your_work_manager.version >= 1.0.0-alpha11)

    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;
    }
    

    true RUNNING 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);
    }
    
        2
  •  2
  •   Irfan    6 年前

    Check Release Notes

    private boolean isWorkScheduled(List<WorkInfo> workInfos) {
    
        boolean running = false;
    
        if (workInfos == null || workInfos.size() == 0) return false;
    
        for (WorkInfo workStatus : workInfos) {
            running = workStatus.getState() == WorkInfo.State.RUNNING | workStatus.getState() == WorkInfo.State.ENQUEUED;
        }
    
        return running;
    }
    
        3
  •  2
  •   David Sucharda    6 年前

    public static boolean isWorkScheduled(String tag) {
        SynchronousWorkManager instance = WorkManager.getInstance().synchronous();
        List<WorkStatus> statuses = instance.getStatusesByTagSync(tag);
        if (statuses.isEmpty()) return false;
        boolean running = false;
        for (WorkStatus workStatus : statuses) {
            running = workStatus.getState() == State.RUNNING
                    | workStatus.getState() == State.ENQUEUED;
        }
        return running;
    }
    

    here

    推荐文章