Привет, я Михаил👋! Сегодня я хочу рассказать вам о Workmanager, о котором я узнал много лет назад (2019?). У меня такое чувство, что уже слишком поздно делиться этим с вами, ребята, но это все еще полезно. Так что все же стоит прочитать этот пост.

🔧Что такое WorkManager

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

WorkManager может планировать периодические асинхронные задачи при следующих обстоятельствах:

  • Когда приложение закрыто
  • При перезагрузке устройства

🔧Итак, какие функции предоставляет WorkManager

  • Обратная совместимость с уровнем API 14 и выше и совместимость с уровнем API 23 и выше
  • JobScheduler обеспечивает эквивалентную функциональность для уровня API 23 и выше.
  • На уровне API с 14 по 22 комбинация BroadcastReceiver и AlarmManager обеспечивает эквивалентную функциональность.
  • Вы можете решить, следует ли выполнять запланированную задачу, в зависимости от состояния терминала, такого как сеть и батарея.
  • Вы можете настроить одноразовую асинхронную задачу.
  • Вы можете отслеживать и контролировать запланированные задачи.
  • Запланированные задачи гарантированно будут выполняться, даже если приложение или устройство перезапустится.
  • Вы можете связать задачи.

🔧 Давайте попробуем и посмотрим, как это работает!

Во-первых, добавьте библиотеку WorkManager в Android Project WorkManager требует скомпилированного SDK версии 28 или выше. Перейти по этой ссылке. Откройте файл build.gradle и добавьте следующее, чтобы использовать библиотеку WorkManager.

def work_version = "2.7.1"

// (Java only)
implementation "androidx.work:work-runtime:$work_version"

// Kotlin + coroutines
implementation "androidx.work:work-runtime-ktx:$work_version"

📌Определить задачу в Worker(Создать класс, который расширяет Worker).
Описать процесс, который вы хотите выполнить, в методе doWork.
И вы можете получить результаты выполнения задачи в класс Результат.

Статус, возвращаемый классом Result, выглядит следующим образом:

  • Result.success(): успешно ли завершена задача.
  • Result.failure(): не удалось ли выполнить задачу.
  • Result.retry(): следует ли повторить задачу позже.

📌Циклическое выполнение
Существует два варианта выполнения задачи: одноразовое выполнение и периодическое выполнение.

Использовать рабочий запрос

⚙️OneTimeWorkRequest: только один раз
⚙️ PeriodicWorkRequest: периодический

📌Образец одноразового рабочего запроса

Например, если вы хотите сделать его периодической задачей каждые 16 секунд, создайте ее следующим образом ⬇️

Как проверить рабочий статус
Рабочий статус хранится в WorkInfo, полученном с помощью getWorkInfoByIdLiveData. Состояние хранится как свойство состояния. Состояния объявляются с помощью Enum внутри класса Work. Проверьте, какой статус.

📖Рабочая информация. Состояние
📝БЛОКИРОВАНО: указывает на состояние, которое невозможно выполнить, поскольку предварительные условия не выполнены.

📝ОТМЕНЕНО: представляет собой отмененное состояние. Связанные рабочие запросы также рассматриваются как отмененные, а связанные рабочие запросы не выполняются.

📝ЗАПИСАН: представляет состояние, в котором предварительные условия выполнены и поставлены в очередь в состоянии готовности.

📝FAILED: Ошибка обработки. Связанные запросы WorkRequest также считаются неудачными, и связанные запросы WorkRequest не выполняются.

📝РАБОТАЕТ: указывает, что процесс запущен.

📝УСПЕШНО: обработка успешно завершена. Запрос PeriodicWorkRequest (выполняемый периодически) не переходит в это состояние, переходит в состояние ENQUEUED и снова выполняется.

📌Если вы хотите получить Статус работника, вы можете реализовать это следующим образом.

Время выполнения задачи

Класс Constraints можно использовать, когда вы хотите изменить каждую задачу в соответствии с состоянием устройства.

setRequiredNetworkType: состояние сети
setRequiresBatteryNotLow: при высоком уровне заряда батареи
setRequiresCharging: при подключении к сети
setRequiresDeviceIdle: когда устройство не используется
setRequiresStorageNotLow: когда у вас много места для хранения

В следующем примере я использую только
setRequiresCharging, что означает, что Worker будет активирован только
когда устройство подключено к питанию. ⬇️

Если вы хотите добавить больше ограничений, вы можете добавить их следующим образом.⬇️

Что такое входные данные в Worker

Нам нужно передать объект Data, чтобы перемещать данные между воркерами. Мы должны установить данные в качестве входных данных при создании работника и получить выходные данные в виде объекта данных.

🧪Класс Data и класс Data.Builder
Используйте класс Data для передачи данных в класс Worker.
Имя слишком общее, и существует много классов с таким же именем , поэтому необходимо помнить о включении пакета.
Полное имя класса — « androidx.work.Data».
Внутри него содержится карта, а данные хранятся в эта карта передается классу, который наследует класс Worker.

Используйте класс Data.Builder для создания объектов класса Data.
Вызовите метод setXXX класса Builder и сохраните данные.

Я думаю, что понимание будет быстрее, если вы посмотрите реальный пример реализации. Итак, давайте рассмотрим процесс создания объекта данных для работника.⬇️

Сохранить в WorkRequest
Чтобы сохранить сгенерированный объект класса Data, вызовите метод setInputData WorkRequest (см. изображение выше).

📌 Получить данные и получить значение в классе Worker
Чтобы получить данные, вызовите метод getinputData в классе, наследующем класс Worker. В Kotlin доступ к свойствам можно получить как к переменной без вызова метода получения.

Чтобы получить сохраненное значение из полученных Данных, укажите ключ при сохранении в методе getXXX и получите его. Давайте проверим его в коде.⬇️

Хорошо, а как насчет Output
Я думаю, что пример, который я подготовил, прямолинеен.
Все, что нам нужно сделать, это передать outputData в sucess(outputData).

Чтобы получить данные, вызовите outputData следующим образом.

✒️Думаю, на этом все. Спасибо, что дочитали до конца! Не стесняйтесь следовать за мной. Каждую неделю буду выкладывать новые посты!