代码之家  ›  专栏  ›  技术社区  ›  Bhavita Lalwani

检查WorkManager Android之前是否已请求WorkRequest

  •  7
  • Bhavita Lalwani  · 技术社区  · 8 年前

    我使用PeriodicWorkRequest每15分钟为我执行一项任务。 我想检查一下,如果这个定期工作要求已事先安排。如果没有,安排时间。

         if (!PreviouslyScheduled) {
            PeriodicWorkRequest dataupdate = new PeriodicWorkRequest.Builder( DataUpdateWorker.class , 15 , TimeUnit.MINUTES).build();
            WorkManager.getInstance().enqueue(dataupdate);
          }
    

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

    需要帮助为工作请求构造一个类似的模块来帮助查找计划的/活动的工作请求。

    3 回复  |  直到 8 年前
        1
  •  30
  •   Alex    7 年前

    为PeriodicWorkRequest任务设置一些标记:

        PeriodicWorkRequest work =
                new PeriodicWorkRequest.Builder(DataUpdateWorker.class, 15, TimeUnit.MINUTES)
                        .addTag(TAG)
                        .build();
    

    然后在enqueue()工作之前检查带有标记的任务:

        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 here

        2
  •  1
  •   pRaNaY    8 年前

    您需要为每个工作请求添加一个唯一的标记。检查 Tagged work

    WorkRequest.Builder.addTag()

    OneTimeWorkRequest cacheCleanupTask =
        new OneTimeWorkRequest.Builder(MyCacheCleanupWorker.class)
    .setConstraints(myConstraints)
    .addTag("cleanup")
    .build();
    

    同样的你可以用来 PeriodicWorkRequest

    WorkManager.getStatusesByTag() .

    这给了你一个 LiveData 列表 WorkStatus 用标签标记的工作。

           WorkStatus workStatus = listOfWorkStatuses.get(0);
    
            boolean finished = workStatus.getState().isFinished();
            if (!finished) {
                // Work InProgress
            } else {
                // Work Finished
            }
    

    您可以查看下面的谷歌示例以了解更多详细信息。在这里,他们添加了如何将标签添加到WorkRequest并按标签获取工作状态:

    https://github.com/googlecodelabs/android-workmanager

    检查下面的代码和注释,以了解如何通过标记获取工作状态。如果工作状态为空,则安排工作。

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

    我没有测试代码。请提供您的反馈。

        3
  •  0
  •   AtHul Antony    8 年前

    我也在搜索相同的条件。我找不到一个。所以为了解决这个问题,我找到了一个机制。首先取消所有计划的工作,重新安排工作。这样我们就可以确保你的作品只保留一个实例。另外,请确保您必须维护这样的工作代码逻辑。

    more

    UUID compressionWorkId = compressionWork.getId();
    WorkManager.getInstance().cancelWorkById(compressionWorkId);
    
        4
  •  0
  •   Ashish Chaugule    6 年前

    保留与现有PeriodicWorkPolicy相同的taskID。保留不会每次都创建新任务。

    现有周期性工作策略(保留,工作);