- Русские Блоги
- Компонент архитектуры Android WorkManager
- 1. Введение в связанные с WorkManager классы
- 1.1、Worker
- 1.2、WorkRequest
- 1.3、WorkManager
- 1.4、WorkStatus
- 1.5、Data
- Два, WorkManager использовать
- 2.1 Задача ввода и вывода
- 2.2 Периодические задания
- 2.3, задача добавить ограничения
- 2.3, отмена задания
- 2.4, цепочка задач
- 2.4.1 Выполнение последовательности задач
- 2.4.2, Комбинированные задачи
- 2.4.3, поток данных задачи в цепочке задач (ввод и вывод каждой задачи)
- 2.4.3.1 Поток данных последовательных задач
- 2.4.3.2, Поток данных комбинированных задач
- 2.4.4 Уникальная рабочая очередь
Русские Блоги
Компонент архитектуры Android WorkManager
Компонент архитектуры WorkManager используется для управления фоновыми рабочими задачами. В настоящее время вам может быть интересно, есть ли в Android уже много классов для управления фоновыми задачами, такими как JobScheduler, AlarmManger, например AsyncTask, ThreadPool. WorkManager. Каковы преимущества WorkManager, почему мы используем WorkManager. Мы проиллюстрируем преимущества WorkManager с двух сторон
- Преимущества WorkManager по сравнению с JobScheduler и AlarmManger: мы должны знать, что, хотя AlarmManager существовал всегда, JobScheduler доступен только после Android 5.x. Базовая реализация WorkManager автоматически выберет JobScheduler или AlarmManager для реализации фоновых задач в соответствии с API вашего устройства.
- Преимущества WorkManager по сравнению с AsyncTask и ThreadPool: задачи в WorkManager могут продолжать выполняться после выхода из приложения. Задачи в AsyncTask, ThreadPool не будут выполняться после выхода из приложения.
WorkManager подходит для тех задач, которые необходимо продолжать выполнять после выхода из приложения (например, в случае, когда данные приложения передаются на сервер). В тех случаях, когда задачи должны быть завершены после выхода из приложения, необходимо выбрать ThreadPool и AsyncTask.
1. Введение в связанные с WorkManager классы
Если вы хотите использовать библиотеку компонентов WorkManager, первым делом нужно понять связанные классы в WorkManager.
1.1、Worker
Рабочий используется для указания конкретных задач, которые необходимо выполнить. Конкретная логика задачи написана в Worker.
Работник — это абстрактный класс. Поэтому нам нужно унаследовать и реализовать этот класс при определении его собственной задачи.
В классе Worker есть несколько ключевых функций: функция реализации логики задачи, функция сбора входных данных задачи и функция настройки выходных данных задачи.
Возвращаемое значение функции doWork ():
-Worker.Result.SUCCESS: задание было успешно выполнено.
-Worker.Result.FAILURE: не удалось выполнить задачу.
-Worker.Result.RETRY: задачу необходимо выполнить повторно и использовать вместе с функцией setBackoffCriteria () в WorkRequest.Builder.
1.2、WorkRequest
WorkRequest представляет собой отдельную задачу и представляет собой пакет задач Worker. Один WorkRequest соответствует одному классу Worker. Мы можем использовать WorkRequest для добавления сведений об ограничениях в класс Worker, таких как указание среды, в которой должна выполняться задача, входные параметры задачи и задача выполняется только при наличии сети и т. Д. WorkRequest является абстрактным классом, и в компоненте есть два соответствующих подкласса: OneTimeWorkRequest (задача выполняется только один раз), PeriodicWorkRequest (задача периодически выполняется).
- WorkRequest.Builder: класс справки для создания объектов WorkRequest.
- Ограничения: укажите ограничения для запуска задачи (например, «только при подключении к сети»). Используйте Constraint.Builder для создания Ограничений и передайте Ограничения в функцию setConstraints () WorkRequest.Builder перед созданием WorkRequest.
Введение в часто используемые функции в WorkRequest
Вот небольшое упоминание о сценарии использования функции SetBackoffCriteria () в Builder, которая используется чаще. Обычно эта функция будет использоваться, когда задача должна быть повторена при сбое выполнения задачи. Когда выполнение задачи завершается неудачей, doWork () класса Worker Функция возвращает Result.RETRY, чтобы сообщить о повторной попытке задания. Стратегия повтора устанавливается функцией setBackoffCriteria (). BackoffPolicy имеет два значения LINEAR (время каждой попытки увеличивается линейно, например, первые 10 минут, второй раз — 20 минут), EXPONENTIAL (экспоненциальное увеличение времени каждой попытки).
1.3、WorkManager
Для управления запросами и очередями задач нам нужно передать объект WorkRequest в WorkManager, чтобы поместить задачи в очередь. Используйте WorkManager для планирования задач по распределению нагрузки на системные ресурсы.
Общие функции WorkManager Введение
Очереди beginWith () и beginUniqueWork () отличаются только тем, можно ли повторять задачи в очереди. Задачи в очереди, запущенные функцией beginWith (), могут повторяться, а задачи в очереди, запущенной функцией beginUniqueWork (), повторяться не могут.
1.4、WorkStatus
Содержит информацию о задаче. WorkManager предоставляет LiveData для каждого объекта WorkRequest (WorkManager получает функции getStatusById, getStatusesByTag, getStatusesForUniqueWork). LiveData содержит объект WorkStatus. LiveData может воспринимать изменения в данных. Наблюдая за этими LiveData, мы можем определить текущее состояние задачи и получить возвращаемое значение после ее завершения. В WorkStatus не так много вещей, кроме идентификатора, тега, статуса и возвращаемого значения задачи.
Контролировать состояние задачи по
1.5、Data
Данные используются для установки входных и выходных параметров для Worker. Например, если нам нужно перейти в сеть для загрузки изображений, нам нужно передать адрес загрузки (входной параметр) в Worker. После успешного выполнения Worker нам необходимо получить локальный путь хранения изображения (выходной параметр). Это входящее и исходящее достигается через данные. Данные представляют собой облегченный контейнер (не более 10 КБ). Данные хранят информацию в форме ключ-значение.
Два, WorkManager использовать
Говоря о некоторых из наиболее часто используемых классов в WorkManager, следующим является использование WorkManager.
Мы делим использование WorkManager на несколько этапов:
-Inherit Worker, специфическая логика обработки задач.
-OneTimeWorkRequest или PeriodicWorkRequest обертывают Worker, устанавливают некоторые ограничения Worker для добавления или параметры ввода Worker.
— задачи ставятся в очередь на выполнение (если несколько задач могут образовывать цепочку задач для постановки в очередь на выполнение).
— Отслеживать вывод задачи (используя LiveData).
2.1 Задача ввода и вывода
Иногда, когда задача выполняется, нам может потребоваться передать параметры извне, и нам нужно сообщить результаты задачи извне, когда задача завершится. Например, если мы заходим в Интернет, чтобы загрузить изображение, то нам нужен адрес URL (вход), а после успешной загрузки изображения получим локальный путь сохранения изображения (выход).
- Входные параметры: если вы хотите передать входные параметры в задачу, вам необходимо установить входные параметры в функции setInputData () WorkRequest.Builder в WorkRequest.Builder. После выполнения задачи входящие параметры можно получить с помощью getInputData ().
- Выходные параметры: если вы хотите передать результаты во внешний мир во время выполнения задачи, вам необходимо установить выходные параметры в Worker через setOutputData (). Позже, если вы хотите получить результат задачи, вам нужно получить LiveData через WorkManager.getInstance (). GetStatusById () или WorkManager.getInstance (). GetStatusesByTag (). Затем используйте LiveData для восприятия изменений в данных задачи.
Давайте возьмем простое усилие, чтобы увидеть, как задача с вводом и выводом должна быть обработана.
OneTimeWorkRequest устанавливает ввод задачи, выполняет задачу, устанавливает вывод во время выполнения задачи, и LiveData определяет результат задачи
2.2 Периодические задания
Библиотека компонентов WorkManager предоставляет класс PeriodicWorkRequest для периодических задач. Однако класс PeriodicWorkRequest имеет ограничение, согласно которому минимальное время цикла составляет 15 минут.
2.3, задача добавить ограничения
В некоторых случаях для некоторых задач могут потребоваться дополнительные ограничения, например, они могут выполняться только при подключении к сети, только когда устройство находится в режиме ожидания и т. Д. Все ограничения в WorkManager реализованы с помощью ограничений, а ограничения также реализованы с помощью Constraints.Builder ().
Обратите внимание на ограничения задачи. Возможно, время, когда наша задача была добавлена, не соответствовало ограничениям, и задача не была выполнена. Однако, как только ограничения будут выполнены, задача будет выполнена автоматически.
Ограничения обычно используемые функции-ограничения, которые могут быть добавлены в следующем
Мы приведем простой пример, например, мы ограничиваем задачу, которая будет выполняться только в состоянии Wi-Fi.
2.3, отмена задания
Каждая задача имеет свой уникальный UUID, мы можем найти задачу по UUID задачи, а затем отменить его. В дополнение к методу UUID мы также можем добавить тег к задаче, а затем использовать тег для отмены задачи (вы можете добавить один и тот же тег к нескольким задачам и отменить их одновременно).
Мы просто реализовали пример отмены задач через теги
2.4, цепочка задач
Иногда мы хотим, чтобы определенные вещи выполнялись в определенном порядке. WorkManager позволяет нам создавать и ставить в очередь рабочие последовательности для нескольких задач и в каком порядке они должны выполняться. Это цепная задача.
Любая задача в цепочке задач возвращает WorkerResult.FAILURE, после чего вся цепочка задач завершается.
Ключом к связанной задаче является WorkContinuation. WorkContinuation используется для организации очереди (независимо от того, выполняется она последовательно или в комбинации), а затем помещается в очередь для выполнения.
Введение в часто используемые функции в WorkContinuation
2.4.1 Выполнение последовательности задач
Выполнение последовательности задач, использование функции then () WorkContinuation. Предположим, у нас есть A, B, C, три задачи должны быть выполнены по порядку.
Чтобы сделать очередную задачу более тщательной, приведем пример.
Три задачи workA1, workA2 и workA3 в функции beginWith кода обращения выполняются параллельно (одновременно), и задачи на следующем шаге должны быть выполнены после того, как workA1, workA2 и workA3 все выполнены. Порядок выполнения workB1 и workB2 в затем (workB1, workB2) не является регулярным, но необходимо подождать, пока workB1 и workB2 все будут выполнены, чтобы затем выполнить задачи. Порядок выполнения workC1 и workC2 также нерегулярен.
2.4.2, Комбинированные задачи
Если вы хотите объединить задачи, вам нужно использовать функцию Combine () WorkContinuation. Мы используем очень распространенную задачу для иллюстрации выполнения комбинированных задач. Например, мы хотим добиться эффекта цепного теста, показанного на рисунке ниже.
Соответствующий код на картинке выше выглядит следующим образом
2.4.3, поток данных задачи в цепочке задач (ввод и вывод каждой задачи)
В цепочке задач у нас может быть такое требование: данные между задачами взаимозависимы, а для следующей задачи требуются выходные данные предыдущей задачи. В этом случае мы называем это потоком данных задач в цепочке задач. На самом деле, мощный WorkManager был разработан для нас. WorkManager будет автоматически использовать выходные данные предыдущего задания в качестве ввода следующего личного задания.
2.4.3.1 Поток данных последовательных задач
Поскольку WorkManager разработан для нас при проектировании, выходные данные предыдущей задачи будут автоматически использоваться в качестве входных данных для следующей задачи. Таким образом, поток данных последовательных задач очень прост в обращении. Предыдущая задача вызывает setOutputData () для возврата своего результата, а следующая задача вызывает getInputData () для получения результата предыдущей задачи. Мы используем простой пример для иллюстрации. A, B, C три последовательных задания. Задача A выдает 10, задача B получает значение задачи A, умножает его на 10 и, наконец, дает результат задачи C. Давайте посмотрим, как написать код в этом случае.
2.4.3.2, Поток данных комбинированных задач
Поток данных объединенной задачи немного сложнее, поскольку выходные данные нескольких задач одновременно используются в качестве входных данных задачи, а выходные данные нескольких задач должны быть объединены в один вход в это время. В это время будет правило слияния (как работать с одним и тем же ключом в разных задачах), WorkManager задает правило слияния нескольких входных потоков задач через функцию setInputMerger () класса OneTimeWorkRequest.Builder. Параметр является классом, унаследованным от InputMerger. InputMerger — абстрактный класс, WorkManager также предоставляет нам два вида правил слияния: ArrayCreatingInputMerger, OverwritingInputMerger.
- ArrayCreatingInputMerger: все значения, соответствующие ключу, будут помещены в массив. Если этот ключ одинаковый, массив будет медленно расширяться. Например, результаты двух задач A и B должны быть объединены вместе. В выводе задачи A есть ключ: a_key-> 100. В задаче B есть два ключа (ключ совпадает с заданием A): b_key-> 100, a_key-> 200. Наконец, результат объединения с помощью правила ArrayCreatingInputMerger: a_key соответствует массиву, и в массиве есть два элемента 100 и 200, а b_key также соответствует массиву, и в нем есть только один элемент 100. В это время, в следующей задаче, если вы хотите получить ввод после слияния, вы должны использовать getIntArray (), потому что значение, соответствующее ключу, теперь является массивом.
- OverwritingInputMerger: если есть тот же ключ, перезаписать напрямую.В ходе тестирования я обнаружил, что OverwritingInputMerger не имеет никакого эффекта, и его производительность такая же, как у ArrayCreatingInputMerger
Мы по-прежнему используем простой пример для иллюстрации потока данных комбинированных задач: у нас есть задачи A, B и C. Задачи A и B объединяются, а затем выполняется задача C. Получите выходные данные двух задач A и B в задаче C.
В выводе задачи A есть только один ключ: a_key -> 100
В выводе задачи B есть два ключа: b_key -> 100, a_key -> 200, ключ также появляется в задаче A
Задача C состоит в том, чтобы просто получить выходные данные задач A и B
Запустите объединенную задачу, вызовите setInputMerger (
OverwritingInputMerger.class), чтобы установить правило слияния
2.4.4 Уникальная рабочая очередь
В приведенном выше примере очереди всех задач цепочки теста создаются WorkManager.getInstance (). BeginWith (). Для созданной таким образом задачи цепного теста нет никаких ограничений, и задача может быть зачислена по желанию. Что делать, если нам нужно одно и то же задание и мы не можем войти в команду повторно В это время нужна только рабочая очередь.
WorkManager позволяет нам создавать уникальные рабочие очереди. Единственная рабочая очередь означает, что задачи в этой очереди нельзя повторно ставить в очередь. WorkManager использует beginUniqueWork () для создания уникальной очереди. При создании уникальной рабочей очереди вы должны указать имя очереди, а также указать ExistingWorkPolicy, когда WorkManager уже имеет идентичную уникальную очередь. ExistingWorkPolicy имеет три значения: REPLACE (отменить существующую последовательность и заменить ее новой последовательностью), KEEP (сохранить существующую последовательность и игнорировать новые запросы), APPEND (добавить новую последовательность в существующую последовательность в конце существующей последовательности После завершения задачи запустите первую задачу из новой последовательности).
Если вы присоединитесь к одной и той же задаче несколько раз в единственной рабочей очереди, программа выйдет ненормально.
Источник