当前位置: 首页 > 知识库问答 >
问题:

使用WorkManager在特定时间安排工作

阴培
2023-03-14

WorkManager是一个库,用于对满足其约束后保证执行的工作进行排队。

因此,在查看了Constraints类之后,我还没有找到任何函数来为工作添加时间约束。例如,我希望在早上8:00AM开始执行一个工作(该工作可以是OneTimeWorkRequest或PerioadWorkRequest两种类型中的任何一种)。如何添加约束以使用WorkManager调度此工作。

共有1个答案

沈博涉
2023-03-14

不幸的是,您现在不能在特定的时间安排工作。如果您有时间关键的实现,那么您应该使用AlarmManager设置警报,通过使用setAndAllowWhileIdle()或setExactAndAllowWhileIdle()可以在打瞌睡时触发警报。

您可以使用workmanager安排一个工作,初始延迟一次,也可以定期执行它,如下所示:

创建员工类:

public class MyWorker extends Worker {
    @Override
    public Worker.WorkerResult doWork() {

        // Do the work here

        // Indicate success or failure with your return value:
        return WorkerResult.SUCCESS;

        // (Returning RETRY tells WorkManager to try this task again
        // later; FAILURE says not to try again.)
    }
}
OneTimeWorkRequest mywork=
        new OneTimeWorkRequest.Builder(MyWorker.class)
        .setInitialDelay(<duration>, <TimeUnit>)// Use this when you want to add initial delay or schedule initial work to `OneTimeWorkRequest` e.g. setInitialDelay(2, TimeUnit.HOURS)
        .build();
WorkManager.getInstance().enqueue(mywork);
// Create a Constraints that defines when the task should run
Constraints myConstraints = new Constraints.Builder()
    .setRequiresDeviceIdle(true)
    .setRequiresCharging(true)
    // Many other constraints are available, see the
    // Constraints.Builder reference
     .build();
OneTimeWorkRequest mywork=
                new OneTimeWorkRequest.Builder(MyWorker.class)
     .setConstraints(myConstraints)
     .build();
WorkManager.getInstance().enqueue(mywork);
 PeriodicWorkRequest periodicWork = new PeriodicWorkRequest.Builder(MyWorker.class, 12, TimeUnit.HOURS)
                                   .build();
  WorkManager.getInstance().enqueue(periodicWork);
 类似资料:
  • 问题内容: 从我可以看到,Gearman不支持计划的作业或延迟的作业。我当时想也许可以先将计划的作业排入队列,然后在该时间段到期后将其添加到Gearman队列中。 任务是持久的,因为它们以文件形式写入服务器的假脱机目录中的目录。因此,唯一的瓶颈可能是将任务添加到Gearman队列的简单脚本,因为它无法在服务器之间分布。将其传递给Gearman来处理实际的工作意味着我可以进行适当的工作记录等。 这是

  • 问题内容: 我的Java Scheduler有一个问题,我的实际需要是我必须在特定时间启动我的进程,并且我将在特定时间停止,我可以在特定时间启动我的进程,但是我不能在特定时间停止我的进程,如何指定进程在调度程序中运行多长时间(在这里我不会放),任何人对此都有建议。 问题答案: 您可以使用带有2个计划的计划,一个计划运行任务,另一个计划终止任务-参见下面的简化示例:

  • 问题内容: 我研究了,但是示例仅涉及使其重现。我正在寻找一种类似的功能,例如说“每个星期一的凌晨1点执行此任务”的功能。 问题答案: 感谢Patrick Altman,最近发布的1.0.3版现在支持此功能。 例:

  • 问题内容: 我研究了,但是示例仅涉及使其重现。我正在寻找一种类似的功能,例如说“每个星期一的凌晨1点执行此任务”的功能。 问题答案: 感谢Patrick Altman,最近发布的1.0.3版现在支持此功能。 例: 请参阅更改日志以获取更多信息: http://celeryproject.org/docs/changelog.html

  • 我们使用Java计时器(Java1.7)来安排一些打印工作。无论DST如何,我们都希望作业在每天的特定时间打印。目前,如果我们将作业设置为打印在4:00 AM,期间为24小时,它将正确打印直到DST日。在秋季夏令时,印刷时间是凌晨3点,而不是4点。我怎样才能解决这个问题?我们希望它在一年中的每一天的特定时间打印。

  • 如何: 在几个月的特定日期安排工作? 大约有10天。 其次是有一个模拟cron的工具,这样你就可以传递日期/时间,工具会告诉你是否触发了cron触发器