Android WorkManager - как отложить задачу? - PullRequest
0 голосов
/ 29 октября 2018

Я строю функционал, который позволит продавцам устанавливать график своего бизнеса. Такая функциональность автоматически изменяет переменную open на true и false в соответствии с временем, установленным продавцом в каждый день недели. Следовательно, было бы в общей сложности 14 возможных разных времен.

Я пытаюсь создать повторяющуюся фоновую задачу, которая могла бы выполнить эту задачу, используя WorkManager, новую библиотеку компонентов архитектуры Android.

val scheduleStartWork = PeriodicWorkRequest.Builder(ScheduleWorker::class.java, 7, TimeUnit.DAYS)
                .setInputData(Data.Builder().putBoolean("isStart", true).build())
                .setScheduleRequestedAt(diff_time, TimeUnit.MILLISECONDS)
                .addTag(weekdays[index])
                .build()

Это дает мне следующую ошибку APILibraryException:

Builder.setScheduleRequestedAt может вызываться только из одной и той же группы библиотек

Мои вопросы:

1) Является ли setScheduleRequestedAt правильным методом для вызова, если я хочу отложить планирование на diff_time?

2) Если да, как я могу решить эту проблему?

PS: diff_time - это разница в миллисекундах от каждого из соответствующих часов каждого дня, установленных пользователем. Пример: понедельник-пятница = 08:00, сб-вс = 10: 00.

Ответы [ 3 ]

0 голосов
/ 22 мая 2019

В новой версии Диспетчера работ ( Версия 2.1.0-alpha02 , выпущенная 16 мая 2019 г.) PeriodicWorkRequests теперь поддерживает начальные задержки. Вы можете использовать метод setInitialDelay в PeriodicWorkRequest.Builder, чтобы установить начальную задержку.

PeriodicWorkRequest workRequest = new PeriodicWorkRequest.Builder(
        WorkerReminderPeriodic.class,
        24,
        TimeUnit.HOURS,
        PeriodicWorkRequest.MIN_PERIODIC_FLEX_MILLIS,
        TimeUnit.MILLISECONDS)
    .setInitialDelay(1, TimeUnit.HOURS)
    .addTag("send_reminder_periodic")
    .build();


WorkManager.getInstance()
        .enqueueUniquePeriodicWork("send_reminder_periodic", ExistingPeriodicWorkPolicy.REPLACE, workRequest);
0 голосов
/ 06 июня 2019

Вам необходимо обновить версию библиотеки диспетчера работ до 2.1.0-alpha03 . В версии WorkManager предусмотрена функция добавления начальной задержки в задании.

Тогда вам нужно использовать метод setInitialDelay (). Ниже приведена реализация, позволяющая использовать то же самое для достижения определенной работы триггера времени:

long initialDelayInSeconds = (futureSpecificTime - System.currentTimeInMills()) / 1000;

PeriodicWorkRequest workRequest =
                new PeriodicWorkRequest.Builder(WorkerClass.class, interval, TimeUnit.SECONDS)
                        .setConstraints(workRequestConstraints)
                        .setInputData(inputData)
                        .addTag(TAG_TASK)
                        .setInitialDelay(initialDelayInSeconds, TimeUnit.SECONDS)
                        .build();
0 голосов
/ 30 октября 2018

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

Ваш лучший вариант - использовать OneTimeWorker с требуемой задержкой, и оттуда вы можете поставить в очередь своего периодического работника на нужный вам период.

В системе отслеживания проблем WorkManager есть запрос функции с объяснением этого обходного пути, который можно использовать в качестве ссылки.

Примечание: из-за того, как работает минимальный интервал, вы не можете построить периодический запрос на выполнение, который выполняется в повторяющееся время, например, каждый день в 4:00 утра. Вы можете указать 24-часовой интервал повторения, но это может привести к казни работника в 4:05 первого дня, 6:00 второго, 6:10 третьего дня и так далее. Если вам нужно выполнять работника в одно и то же время каждый день, лучше всего использовать OneTimeWorkRequest с начальной задержкой:

OneTimeWorkRequest save = new OneTimeWorkRequest
            .Builder(SaveImageToFileWorker.class)
            .setConstraints(constraints)
            .setInitialDelay(24, TimeUnit.HOURS)
            .addTag(TAG_OUTPUT)
            .build();

Когда работник завершен, вы можете перенести его с задержкой, чтобы он был запущен в правильное время (точное время выполнения работника зависит от используемых вами ограничений). при создании рабочего запроса).

...