使用WorkManager的PeriodicWorkRequest

时间:2018-07-03 11:04:01

标签: android android-workmanager

由于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时,它也将立即开始工作,

  • 有人知道如何停止立即执行工作吗?在使用PeriodicWorkRequest时。
  • 还想知道我们如何重新安排工作? 如果我想更改已安排的工作时间怎么办?

我正在使用:implementation "android.arch.work:work-runtime:1.0.0-alpha04"

任何帮助将不胜感激。

4 个答案:

答案 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
    )

Visual ilustration

答案 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