首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检查WorkRequest是否曾被WorkManager Android查询过

问检查WorkRequest是否曾被WorkManager Android查询过
EN

Stack Overflow用户
提问于 2018-07-18 11:41:59
回答 4查看 9.7K关注 0票数 18

我使用PeriodicWorkRequest每15分钟为我执行一项任务。我想检查一下,这一定期工作请求是否已经安排好了。如果没有,就安排一下。

代码语言:javascript
复制
     if (!PreviouslyScheduled) {
        PeriodicWorkRequest dataupdate = new PeriodicWorkRequest.Builder( DataUpdateWorker.class , 15 , TimeUnit.MINUTES).build();
        WorkManager.getInstance().enqueue(dataupdate);
      }

以前,当我使用JobScheduler执行任务时,我经常使用

代码语言:javascript
复制
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 ;
}

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-10-30 07:49:27

为您的PeriodicWorkRequest任务设置一些标记:

代码语言:javascript
复制
    PeriodicWorkRequest work =
            new PeriodicWorkRequest.Builder(DataUpdateWorker.class, 15, TimeUnit.MINUTES)
                    .addTag(TAG)
                    .build();

然后在enqueue() work之前用标记检查任务:

代码语言:javascript
复制
    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
    }

但是,如果你真的不需要知道它是否已经安排好了,你可以使用:

代码语言:javascript
复制
    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。

票数 31
EN

Stack Overflow用户

发布于 2018-07-19 06:13:40

您需要向每个WorkRequest添加一个唯一的标记。检查标记工作。

您可以通过向任何WorkRequest对象分配标记字符串来对任务进行逻辑分组。为此,您需要调用WorkRequest.Builder.addTag()

请查看下面的Android示例:

代码语言:javascript
复制
OneTimeWorkRequest cacheCleanupTask =
    new OneTimeWorkRequest.Builder(MyCacheCleanupWorker.class)
.setConstraints(myConstraints)
.addTag("cleanup")
.build();

与用于PeriodicWorkRequest的相同

然后,您将使用WorkStatus获得带有该标记的所有任务的所有WorkManager.getStatusesByTag()列表。

它为您提供了一个带有标记的工作的LiveData WorkStatus列表。

然后可以使用WorkStatus检查状态,如下所示:

代码语言:javascript
复制
       WorkStatus workStatus = listOfWorkStatuses.get(0);

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

有关更多细节,您可以查看下面的google示例。在这里,他们添加了如何向WorkRequest添加标记并通过标记获取工作状态:

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

编辑,检查下面的代码,并注释如何通过标记获取WorkStatus。如果WorkStatus结果为空,则安排我们的工作。

代码语言:javascript
复制
 // 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
        }
    });

我还没有测试代码。请提供同样的反馈意见。

希望这能帮到你。

票数 1
EN

Stack Overflow用户

发布于 2018-07-19 06:12:31

我也在寻找同样的条件,我找不到one.So,为了解决这个问题,我找到了一个mechanism.First,取消了所有预定的工作,并重新安排了工作。这样我们就能确保你的工作中只有一个实例得到维护。另外,请确保您必须像这样维护您的工作代码逻辑。

因为取消了一项工作。对于更多

代码语言:javascript
复制
UUID compressionWorkId = compressionWork.getId();
WorkManager.getInstance().cancelWorkById(compressionWorkId);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51401148

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档