首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android WorkManager -如何延迟任务?

Android WorkManager -如何延迟任务?
EN

Stack Overflow用户
提问于 2018-10-29 15:04:37
回答 3查看 9.2K关注 0票数 12

我正在构建一个功能,允许商家设置他们的业务时间表。这样的功能将自动将变量open更改为true,并相应地将false更改为商人在一周中的每一天设置的时间。因此,可能会有14次不同的时间。

我正在尝试构建一个反复出现的后台任务,使用新的Architecture组件库WorkManager来完成这样的任务。

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

EN

回答 3

Stack Overflow用户

发布于 2018-10-30 11:18:39

更新

由于WorkManager v2.1-alpha02 02,现在可以向PeriodicWorkRequest添加初始延迟。现在你的电话变得简单了:

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

代码语言:javascript
复制
OneTimeWorkRequest save = new OneTimeWorkRequest
            .Builder(SaveImageToFileWorker.class)
            .setConstraints(constraints)
            .setInitialDelay(24, TimeUnit.HOURS)
            .addTag(TAG_OUTPUT)
            .build();

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

票数 18
EN

Stack Overflow用户

发布于 2019-06-06 06:07:01

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

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

代码语言:javascript
复制
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();
票数 2
EN

Stack Overflow用户

发布于 2019-05-22 06:14:50

在新版工作经理(版本2.1.0-字母02于2019年5月16日发布)中,PeriodicWorkRequests现在支持最初的延迟。您可以在setInitialDelay上使用PeriodicWorkRequest.Builder方法来设置初始延迟。

代码语言:javascript
复制
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);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53048327

复制
相关文章

相似问题

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