Периодические ежедневные рабочие запросы с использованием WorkManager - PullRequest
0 голосов
/ 15 мая 2018

Как правильно использовать новый WorkManager из Android Jetpack для планирования периодической работы один раз в день, которая должна выполнять определенные действия ежедневно и ровно один раз?

Идея состояла в том, чтобы проверить,работа с данным тегом уже существует с использованием WorkManager и для начала новой периодической работы иначе.

Я пытался сделать это, используя следующий подход:

public static final String CALL_INFO_WORKER = "Call worker";

...

WorkManager workManager = WorkManager.getInstance();
List<WorkStatus> value = workManager.getStatusesByTag(CALL_INFO_WORKER).getValue();
if (value == null) {
    WorkRequest callDataRequest = new PeriodicWorkRequest.Builder(CallInfoWorker.class,
                24, TimeUnit.HOURS, 3, TimeUnit.HOURS)
                .addTag(CALL_INFO_WORKER)
                .build();
    workManager.enqueue(callDataRequest);
}

Но value всегда равно нулю, даже если я поместил точку останова в метод Worker doWork() (так что он определенно выполняется) и проверил рабочий статус из другого потока.

Ответы [ 3 ]

0 голосов
/ 26 июня 2018

Теперь вы можете использовать enqueueUniquePeriodicWork метод.Он был добавлен в версии 1.0.0-alpha03 WorkManager.

0 голосов
/ 22 ноября 2018

Вы ищете enqueueUniquePeriodicWork

Этот метод позволяет ставить в очередь уникальное имя PeriodicWorkRequest , где только одинPeriodicWorkRequest определенного имени может быть активным одновременно.Например, вы можете захотеть, чтобы была активна только одна операция синхронизации.Если имеется одно ожидание, вы можете разрешить его запуск или заменить его новой работой.

Пример кода

public static final String TAG_MY_WORK = "mywork";

public static void scheduleWork(String tag) {
    PeriodicWorkRequest.Builder photoCheckBuilder =
            new PeriodicWorkRequest.Builder(WorkManagerService.class, 1, TimeUnit.DAYS);
    PeriodicWorkRequest request = photoCheckBuilder.build();
    WorkManager.getInstance().enqueueUniquePeriodicWork(tag, ExistingPeriodicWorkPolicy.KEEP , request);
}

Вы получаете дватипы ExistingPeriodicWorkPolicy

KEEP

Если существует ожидающая работа с таким же уникальным именем, ничего не делать.

REPLACE

Если существует ожидающая работа с таким же уникальным именем, отмените и удалите ее.

0 голосов
/ 15 мая 2018

В конце концов, я понял, что проблема заключается в том, как используется LiveData. Поскольку нет наблюдателей, внутри нет никакой ценности.

Проблема с использованием только PeriodicWork заключается в том, что она не обеспечивает уникальность работы, которую вы хотите сделать. Другими словами, возможно иметь много работ, которые будут активны одновременно, выпуская больше раз, чем вам нужно.

...