代码之家  ›  专栏  ›  技术社区  ›  rgoncalv

Android WorkManager-如何延迟任务?

  •  1
  • rgoncalv  · 技术社区  · 7 年前

    我正在构建一个功能,允许商家设置他们的业务时间表。这样的功能会自动改变变量 open true false 根据商户在一周中每天设定的时间。因此,总共可能有14个不同的时间。

    我正在尝试构建一个经常性的后台任务,该任务将使用新的Android架构组件库WorkManager完成。

    val scheduleStartWork = PeriodicWorkRequest.Builder(ScheduleWorker::class.java, 7, TimeUnit.DAYS)
                    .setInputData(Data.Builder().putBoolean("isStart", true).build())
                    .setScheduleRequestedAt(diff_time, TimeUnit.MILLISECONDS)
                    .addTag(weekdays[index])
                    .build()
    

    但它给了我以下ApLibraryException错误:

    建设者只能从同一个库组内调用SetScheduleRequestData

    我的问题是:

    1) 是吗 setScheduleRequestedAt 如果我想通过以下方式延迟日程安排,请调用正确的方法: diff_time ?

    2) 如果是,我该如何解决这个问题?

    附言: 不同时间 是与用户设置的每天相应小时数的差值(以毫秒为单位)。示例:周一至周五=08:00,周六至周日=10:00。

    1 回复  |  直到 7 年前
        1
  •  17
  •   pfmaggi    6 年前

    使现代化

    自从 WorkManager v2.1-alpha02 现在,可以为一个项目添加一个初始延迟 PeriodicWorkRequest .现在你的电话变成了:

    val scheduleStartWork = PeriodicWorkRequest.Builder(ScheduleWorker::class.java, 7, TimeUnit.DAYS)
                    .setInputData(Data.Builder().putBoolean("isStart", true).build())
                    .setInitialDelay(diff_time, TimeUnit.MILLISECONDS)
                    .addTag(weekdays[index])
                    .build()
    

    笔记 因为 setInitialDelay 已在父类中引入, WorkRequest ,这引入了一个从v2开始的二进制更改。0到v2。1个用于 OneTimeWorkRequest#setInitialDelay() 方法这意味着要使用新库,从v2升级时需要重新编译项目。0

    遵循最初的答案

    使用WorkManager无法延迟周期性任务的第一次运行。

    你最好的选择是使用一个一次性的工作者,你想要的延迟,从那里你可以让你的定期工作者按你想要的时间排队。

    There's a feature request on WorkManager's issue tracker with an explanation for this workaround that you can use as a reference.

    注: 由于最小间隔的工作方式,您无法构建在重复时间执行的定期工作请求,例如每天凌晨4:00执行。您可以指定一个24小时重复间隔,但这可以让worker在第一天早上4:05、第二天早上6:00、第三天早上6:10执行,依此类推。 如果你需要在每天的同一时间执行一个工作人员,你最好的选择是使用 OneTimeWorkRequest 最初的延迟:

    OneTimeWorkRequest save = new OneTimeWorkRequest
                .Builder(SaveImageToFileWorker.class)
                .setConstraints(constraints)
                .setInitialDelay(24, TimeUnit.HOURS)
                .addTag(TAG_OUTPUT)
                .build();
    

    工作人员完成后,可以延迟重新安排,以便在正确的时间解雇(工作人员的确切执行时间取决于创建工作请求时使用的约束)。

        2
  •  2
  •   Manmohan Soni    7 年前

    您需要将work manager库版本更新为 2.1.0-alpha03 .在版本中,WorkManager提供了添加任务初始延迟的功能。

    然后需要使用setInitialDelay()方法。以下是以同样的方式实现特定时间触发工作的实现:

    long initialDelayInSeconds = (futureSpecificTime - System.currentTimeInMills()) / 1000;
    
    PeriodicWorkRequest workRequest =
                    new PeriodicWorkRequest.Builder(WorkerClass.class, interval, TimeUnit.SECONDS)
                            .setConstraints(workRequestConstraints)
                            .setInputData(inputData)
                            .addTag(TAG_TASK)
                            .setInitialDelay(initialDelayInSeconds, TimeUnit.SECONDS)
                            .build();
    
        3
  •  1
  •   Anjal Saneen    7 年前

    在新版工作经理中( Version 2.1.0-alpha02 发布于2019年5月16日)PeriodicWorkRequests现在支持初始延迟。您可以在PeriodicWorkRequest上使用setInitialDelay方法。生成器设置初始延迟。

    PeriodicWorkRequest workRequest = new PeriodicWorkRequest.Builder(
            WorkerReminderPeriodic.class,
            24,
            TimeUnit.HOURS,
            PeriodicWorkRequest.MIN_PERIODIC_FLEX_MILLIS,
            TimeUnit.MILLISECONDS)
        .setInitialDelay(1, TimeUnit.HOURS)
        .addTag("send_reminder_periodic")
        .build();
    
    
    WorkManager.getInstance()
            .enqueueUniquePeriodicWork("send_reminder_periodic", ExistingPeriodicWorkPolicy.REPLACE, workRequest);