Привет, я Михаил👋! Сегодня я хочу рассказать вам о 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 следующим образом.
✒️Думаю, на этом все. Спасибо, что дочитали до конца! Не стесняйтесь следовать за мной. Каждую неделю буду выкладывать новые посты!