我正在构建一个功能,允许商家设置他们的业务时间表。这样的功能将自动将变量open更改为true,并相应地将false更改为商人在一周中的每一天设置的时间。因此,可能会有14次不同的时间。
我正在尝试构建一个反复出现的后台任务,使用新的Architecture组件库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()不过,它给了我以下APILibraryException错误:
只能从同一个库组中调用Builder.setScheduleRequestedAt。
我的问题:
( 1)如果我想延迟diff_time的调度,那么它是调用的正确方法吗?
2)若然,我如何解决这个问题?
PS:diff_time是以毫秒为单位,与用户设置的每一天对应小时的差值。例句:星期一-星期五= 08:00,星期六-太阳= 10:00。
发布于 2018-10-30 11:18:39
更新
由于WorkManager v2.1-alpha02 02,现在可以向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()Note,因为setInitialDelay是在父类WorkRequest中引入的,因此为OneTimeWorkRequest#setInitialDelay()方法引入了从v2.0到v2.1的二进制更改。这意味着要使用新的库,您需要在从v2.0升级时重新编译项目。
遵循原来的答案
使用WorkManager不可能延迟定期任务的第一次运行。
您最好的选择是使用一个带有您想要的延迟的OneTimeWorker,从那里您可以用您想要的时间段为您的定期工作人员排队。
在WorkManager的问题跟踪器上有一个特性请求,并给出了对此解决方案的解释,您可以将其用作参考。
备注:由于最小间隔是如何工作的,您不能构建一个周期性的工作请求,该请求可以在重复的时间(例如每天凌晨4:00 )执行。您可以指定24小时重复间隔,但是这可以使工人在第一天凌晨4:05分、第二天早上6:00执行、第三天早上6:10执行等等。如果您需要每天同时执行一个工作人员,最好的选择是使用具有初始延迟的OneTimeWorkRequest:
OneTimeWorkRequest save = new OneTimeWorkRequest
.Builder(SaveImageToFileWorker.class)
.setConstraints(constraints)
.setInitialDelay(24, TimeUnit.HOURS)
.addTag(TAG_OUTPUT)
.build();当工作人员完成后,您可以使用延迟重新安排它,以便在正确的时间触发它(要执行的确切时间取决于您在创建工作请求时使用的约束)。
发布于 2019-06-06 06:07:01
您需要将工作管理器库版本更新为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();发布于 2019-05-22 06:14:50
在新版工作经理(版本2.1.0-字母02于2019年5月16日发布)中,PeriodicWorkRequests现在支持最初的延迟。您可以在setInitialDelay上使用PeriodicWorkRequest.Builder方法来设置初始延迟。
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);https://stackoverflow.com/questions/53048327
复制相似问题