9

由于 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

4 回答 4

14

您可以通过在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
    )

视觉插图

于 2018-11-23T12:38:52.373 回答
2

您需要将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
    )
}
于 2020-05-18T05:31:37.850 回答
0

您的代码总是重新安排工作,因此您可以根据需要更改工作参数

instance.enqueueUniquePeriodicWork(TAG, ExistingPeriodicWorkPolicy.REPLACE, build);

如果您想使用相同的参数(即使在重新启动后)保持工作,而不进行任何更改,请使用:

instance.enqueueUniquePeriodicWork(TAG, ExistingPeriodicWorkPolicy.KEEP, build);

在这种情况下,只有在工作还没有开始的情况下才会安排它。

要停止工作任务,请使用

// cancel the unique work
instance.cancelUniqueWork(TAG);
// clear all finished or cancelled tasks from the WorkManager 
instance.pruneWork();

顺便说一句,我认为使用相同的标签作为唯一的工作 ID 和任务标签并不是一个好方法。如果您需要独特的工作 - 您根本不需要任务标签。任务标签适用于案例,然后您想要执行多个任务

于 2018-11-08T17:14:05.163 回答
-1

要延迟任务,您可以使用 setInitialDelay。

我们使用 setInitialDelay 来确保在事件发生当天而不是立即触发通知。此延迟由一个单独的方法计算,该方法返回从现在到应该触发通知的时间(在事件发生日期的中午)之间的毫秒数。请注意,这种延迟并不总是准确的!由于现代 Android 的工作方式,您的工作可能会因多种因素而延迟,因此出于对时间敏感的目的,请注意这一点。

所有信息都在这篇文章中。https://medium.com/@eydryan/scheduling-notifications-on-android-with-workmanager-6d84b7f64613

于 2018-07-18T16:10:30.310 回答