android 使用工作管理器的定期工作请求

5us2dqdw  于 2023-01-15  发布在  Android
关注(0)|答案(5)|浏览(174)

由于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"
任何帮助都将不胜感激。

23c0lvtd

23c0lvtd1#

您可以通过在PeriodicWorkRequest.Builder中使用弹性周期来实现这一点。例如,如果您希望在重复间隔结束时的15分钟内(假设为8小时)运行您的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

laximzn5

laximzn52#

您需要将 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
    )
}
dfty9e19

dfty9e193#

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

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和任务标签不是一个好方法。如果你需要唯一的工作-你真的不需要任务标签。任务标签是为情况下,然后你想有几个任务

byqmnocz

byqmnocz4#

您可以使用setInitialDelay延迟任务。这对OneTimeWorkRequestPeriodicWorkRequest都有效。

val myWorkRequest = OneTimeWorkRequestBuilder<MyWork>()
   .setInitialDelay(10, TimeUnit.MINUTES)
   .build()

PeriodicWorkRequest的情况下,只有周期性工作的第一次运行会被延迟。

wgeznvg7

wgeznvg75#

要延迟任务,可以使用setInitialDelay。
我们使用setInitialDelay来确保通知在事件当天触发,而不是立即触发。此延迟由一个单独的方法计算,该方法返回从现在到通知应触发的时间之间的毫秒数(在活动日期的中午)。请注意,这个延迟并不总是准确的!由于现代Android的工作方式,您的工作可能会被许多因素延迟,因此,出于时间敏感的目的,请注意这一点。
所有的信息都在这篇文章中。https://medium.com/@eydryan/scheduling-notifications-on-android-with-workmanager-6d84b7f64613

相关问题