Инициировать PeriodicWorkRequest из кода

Я использую WorkManager -> PeriodicWorkRequest для настройки периодической фоновой синхронизации базы данных с сервером.

val workManager = WorkManager.getInstance()

val syncFileWork = PeriodicWorkRequestBuilder<FileSyncWorker>(
        intervalInMins,
        TimeUnit.MINUTES,
        PeriodicWorkRequest.MIN_PERIODIC_FLEX_MILLIS,
        TimeUnit.MILLISECONDS
)
        .setInputData(mapOf(KEY_FROM_PERIODIC_SYNC to true).toWorkData())
        .addTag("PeriodicSyncRequest")
        .build()

workManager
        ?.enqueueUniquePeriodicWork("PeriodicSyncRequest", ExistingPeriodicWorkPolicy.REPLACE, syncFileWork)

Этот бит работает нормально.

Я отдельно использую OneTimeWorkRequest для синхронизации с сервером, когда пользователь выполняет, скажем, обновление по запросу:

    val workManager = WorkManager.getInstance()

    val syncFileWork = OneTimeWorkRequestBuilder<FileSyncWorker>()
            .addTag("SyncRequest")
            .build()

    workManager
            ?.beginUniqueWork("ManualSync", ExistingWorkPolicy.KEEP, syncFileWork)
            ?.enqueue()

Это тоже отлично работает.

Теперь я хочу использовать периодический запрос вместо одноразового запроса. Моя основная причина заключается в том, чтобы не выполнять двойную синхронизацию, когда периодический запрос запускается сразу после того, как пользователь выполнил синхронизацию вручную.

Есть ли способ вызвать PeriodicWorkRequest из кода, чтобы я мог заменить OneTimeWorkRequest вызовом PeriodicWorkRequest.


person Adi B    schedule 09.07.2018    source источник


Ответы (1)


Я не помню, чтобы это было вариантом, извините.

Вместо этого следите за последней синхронизацией и пусть PeriodicWorkRequest пропустит ее, если самая последняя синхронизация слишком последняя.

person CommonsWare    schedule 09.07.2018
comment
Спасибо! Это то, что я делаю в данный момент. Я сохраняю метку времени при успешной синхронизации и пропускаю периодическую синхронизацию, если она происходит в течение нескольких минут после отметки времени. Это работает, но просто не чувствует себя хорошо. Должен быть лучший способ. - person Adi B; 10.07.2018
comment
@AdiB: Возможно, они могут расширить уникальную систему работы, чтобы охватить как разовые, так и периодические запросы. Вы бы назвали свою периодическую рабочую синхронизацию (или что-то еще), а когда пользователь запросил ручную синхронизацию, вы бы назвали свою одноразовую рабочую синхронизацию. Это повлечет за собой перерасчет того, когда в следующий раз следует выполнить периодическую работу. Тем не менее, AFAICT, все уникальные рабочие материалы на данный момент привязаны к OneOffWorkRequest. - person CommonsWare; 10.07.2018