Как последовательно выполнять задачи менеджера работ (когда у вас не все работают одновременно)

Я хочу загрузить некоторые объекты на сервер. Я использую диспетчер работ и uniqueWork, чтобы не загружать повторяющиеся объекты. Есть ограничение на работу, так что они работают только при наличии подключения к Интернету. Проблема в том, что я хочу, чтобы каждый из этих объектов загружался по одному, но вся работа происходит сразу.

Я знаю, что могу использовать beginWith и workContinuations для последовательного выполнения работы, но, к сожалению, несколько объектов могут быть созданы в разное время, поэтому у меня нет доступа ко всей работе во время создания работы.

val workRequest = OneTimeWorkRequestBuilder<UploadWorker>()
            .setConstraints(networkConstraint)
            .build()
WorkManager.getInstance()
            .enqueueUniqueWork(uniqueName, ExistingWorkPolicy.KEEP, workRequest)

Я предположил, что enqueue означает, что вся работа будет выполняться по очереди, как очередь. Есть ли способ заставить это работать именно так?


person Myk    schedule 14.06.2019    source источник


Ответы (1)


Вы можете использовать конструкцию UniqueWork WorkManager, чтобы иметь возможность ставить работу в очередь, чтобы она выполнялась только один раз. Уникальная работа отмечена знаком uniqueName.

В вашем случае вам следует использовать другой ExistingWorkPollicy, как описано в документация: ExistingWorkPollicy.APPEND. Это гарантирует, что ваш новый запрос добавляется после других запросов, использующих тот же uniqueName (это фактически создает цепочку работы).

val workRequest = OneTimeWorkRequestBuilder<UploadWorker>()
            .setConstraints(networkConstraint)
            .build()
WorkManager.getInstance()
            .enqueueUniqueWork(uniqueName, ExistingWorkPolicy.APPEND, workRequest)
person pfmaggi    schedule 23.06.2019