由于WorkManager是Google I/O中新引入的,我尝试使用它来定期执行任务。
我所做的是,使用PeriodicWorkRequest
按如下方式安排工作:
Constraints constraints = new Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED).build();
PeriodicWorkRequest build = new PeriodicWorkRequest.Builder(SyncJobWorker.class, MY_SCHEDULE_TIME, TimeUnit.MILLISECONDS)
.addTag(TAG)
.setConstraints(constraints)
.build();
WorkManager instance = WorkManager.getInstance();
if (instance != null) {
instance.enqueueUniquePeriodicWork(TAG, ExistingPeriodicWorkPolicy.REPLACE, build);
}
我遇到的问题是,当我请求PeriodicWorkRequest
时,它也会立即开始工作,
- 有人知道如何在使用PeriodicWorkRequest时停止立即执行的工作吗?**
- 还想知道如何重新安排工作?如果我想更改已安排工作的时间,该怎么办?
我正在使用:implementation "android.arch.work:work-runtime:1.0.0-alpha04"
任何帮助都将不胜感激。
5条答案
按热度按时间23c0lvtd1#
您可以通过在PeriodicWorkRequest.Builder中使用弹性周期来实现这一点。例如,如果您希望在重复间隔结束时的15分钟内(假设为8小时)运行您的Worker,代码将如下所示:
Visual ilustration
laximzn52#
您需要将 initialDelay 添加到构建器中
dfty9e193#
您的代码总是重新计划工作,因此您可以根据需要更改工作参数
如果你想保持工作与相同的参数(即使在重新启动后),没有任何变化,用途:
在这种情况下,只有当工作还没有被排期时才对其进行调度。
要停止工作任务,请使用
顺便说一句,我认为使用相同的标签作为唯一的工作ID和任务标签不是一个好方法。如果你需要唯一的工作-你真的不需要任务标签。任务标签是为情况下,然后你想有几个任务
byqmnocz4#
您可以使用
setInitialDelay
延迟任务。这对OneTimeWorkRequest
和PeriodicWorkRequest
都有效。在
PeriodicWorkRequest
的情况下,只有周期性工作的第一次运行会被延迟。wgeznvg75#
要延迟任务,可以使用setInitialDelay。
我们使用setInitialDelay来确保通知在事件当天触发,而不是立即触发。此延迟由一个单独的方法计算,该方法返回从现在到通知应触发的时间之间的毫秒数(在活动日期的中午)。请注意,这个延迟并不总是准确的!由于现代Android的工作方式,您的工作可能会被许多因素延迟,因此,出于时间敏感的目的,请注意这一点。
所有的信息都在这篇文章中。https://medium.com/@eydryan/scheduling-notifications-on-android-with-workmanager-6d84b7f64613