由于WorkManager是Google I / O中的新功能,因此我正在尝试使用workmanager定期执行任务,
我正在做的是,使用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
时,它也将立即开始工作,
我正在使用:implementation "android.arch.work:work-runtime:1.0.0-alpha04"
任何帮助将不胜感激。
答案 0 :(得分:3)
您可以通过在PeriodicWorkRequest.Builder中使用弹性周期来实现。 例如,如果您希望在重复间隔结束(例如8小时)后的15分钟内运行Worker,则代码将如下所示:
val periodicRefreshRequest = PeriodicWorkRequest.Builder(
RefreshWorker::class.java, // Your worker class
8, // repeating interval
TimeUnit.HOURS,
15, // flex interval - worker will run somewhen within this period of time, but at the end of repeating interval
TimeUnit.MINUTES
)
答案 1 :(得分:0)
您的代码始终会重新安排工作的时间,因此您可以根据需要更改工作参数
.csv
如果您希望使用相同的参数(即使在重新启动后)也可以进行修改,而无需进行任何更改,请使用:
instance.enqueueUniquePeriodicWork(TAG, ExistingPeriodicWorkPolicy.REPLACE, build);
在这种情况下,仅在工作尚未入围时才安排它。
要停止工作任务,请使用
instance.enqueueUniquePeriodicWork(TAG, ExistingPeriodicWorkPolicy.KEEP, build);
顺便说一句,我认为将相同的TAG与唯一工作ID和任务标签一起使用并不是一种好方法。万一您需要独特的工作-根本就不需要任务标签。任务标签用于某些情况,那么您要执行多个任务
答案 2 :(得分:0)
您需要将 initialDelay 添加到构建器
fun scheduleRecurringFetchWeatherSyncUsingWorker() {
val constraints: Constraints = Constraints.Builder().apply {
setRequiredNetworkType(NetworkType.CONNECTED)
setRequiresBatteryNotLow(true)
}.build()
val request: PeriodicWorkRequest = PeriodicWorkRequest.Builder(
MySimpleWorker::class.java, 3, TimeUnit.HOURS, 1, TimeUnit.HOURS)
.setConstraints(constraints)
.setInitialDelay(2, TimeUnit.HOURS)
.setBackoffCriteria(BackoffPolicy.LINEAR, 1, TimeUnit.HOURS)
.build()
mWorkManager.enqueueUniquePeriodicWork(
TAG_WORK_NAME,
ExistingPeriodicWorkPolicy.KEEP,
request
)
}
答案 3 :(得分:-1)
要延迟任务,可以使用setInitialDelay。
我们使用setInitialDelay来确保触发通知 在活动当天而不是立即进行。这个延迟是 由单独的方法计算得出,该方法返回 从现在到通知应触发之间的毫秒数(在 活动日期的中午)。请注意,此延迟不是 永远准确!由于现代Android的运作方式,您的作品可以 由于许多因素而延迟,因此请非常注意这一点 敏感的目的。
所有信息都在此帖子中。 https://medium.com/@eydryan/scheduling-notifications-on-android-with-workmanager-6d84b7f64613