Как изменить периодический период запроса на работу без его немедленного запуска с помощью WorkManager? - PullRequest
0 голосов
/ 10 октября 2018
val request = PeriodicWorkRequestBuilder<FooWorker>(1, TimeUnit.DAYS).build()
WorkManager.getInstance().enqueueUniquePeriodicWork(
    "FOO",
    ExistingPeriodicWorkPolicy.REPLACE,
    request
)

Приведенный выше код запускается в onCreate из Application, чтобы обеспечить запрос в очереди.Однако это вызовет проблему, при которой FooWorker будет запускаться каждый раз, когда пользователь запускает приложение, потому что ExistingPeriodicWorkPolicy.REPLACE отменяет предыдущую работу и ставит в очередь новую работу, что приводит к ее немедленному запуску.

Если мы изменим на ExistingPeriodicWorkPolicy.KEEP, мы не сможем заменить работу, даже если период или рабочая смена изменены.

Есть ли способ заменить запрос после выполнения текущего?

Например, запрос источниказапускать 1 раз в день, а новый запрос - 1 раз в час.После выполнения следующего исходного запроса замените его новым запросом.

Ответы [ 2 ]

0 голосов
/ 10 апреля 2019

Похоже, что теперь есть возможность заменить периодическую работу на enqueueUniquePeriodicWork .

  val request = PeriodicWorkRequest.Builder(FooWorker::class.java, 1, TimeUnit.DAYS).build()
  WorkManager.getInstance(appContext)
  .enqueueUniquePeriodicWork(WORK_TAG, ExistingPeriodicWorkPolicy.REPLACE, request)

Убедитесь, что вы передаете ExistingPeriodicWorkPolicy вместо ExistingWorkPolicy

0 голосов
/ 10 октября 2018

Нет способа сделать то, что вы хотите, с периодической работой чистым способом.

Однако, нет никакой необходимости использовать саму периодическую работу.Та же самая структура может быть легко достигнута путем планирования следующего WorkRequest в конце вашего doWork метода, прямо перед возвратом Result.SUCCESS:

fun doWork(): Result {
  reallyDoWork()
  // Now schedule the next "periodic" work
  val request = OneTimeWorkRequestBuilder<FooWorker>().build()
  WorkManager.getInstance().enqueueUniqueWork(
    "FOO",
    ExistingWorkPolicy.REPLACE,
    request
  )
  return Result.SUCCESS
}

С этой настройкой ваш onCreate() из Applicationможете безопасно использовать ExistingWorkPolicy.KEEP, чтобы избежать перепланирования работы, если у вас уже есть очередь WorkRequest, и когда эта очередь запускает работу, следующий WorkRequest будет поставлен в очередь с соответствующим новым периодом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...