Временные задачи можно упростить, используя сопрограммы и задания над обработчиком. Смотри как!
Сценарий
Все мы использовали обработчики с методом postDelayed
для выполнения какой-либо задачи через определенное время в наших приложениях для Android. Это был наш основной способ выполнения задач с такими временными требованиями.
При использовании Handler
типичный код для выполнения задачи через 10 секунд будет выглядеть так:
Я думаю, это утомительно!
Создание и обслуживание экземпляра обработчика становится особенно утомительным, когда есть область, которая просит нас отменить текущую временную задачу, и у нас одновременно выполняется несколько задач.
В этом случае нам пришлось бы поддерживать либо токен, либо отдельный исполняемый экземпляр для отмены нужной задачи между ними до истечения таймера.
Кроме того, предоставление экземпляра Looper для создания обработчика может показаться немного утомительным, и большинство из нас склонны просто использовать основной цикл по умолчанию (используемый в приведенном выше описании), что снова вызывает некоторые проблемы с пользовательским интерфейсом / Janks и т. д.
Введите сопрограммы и задания
Благодаря механизму Kotlin Coroutines and Jobs мы можем избежать использования обработчиков в этом сценарии, создав облегченные задания Coroutine и отменив их между ними, чтобы просто остановить выполнение желаемой задачи.
Приведенный выше код с использованием Coroutine Job будет выглядеть так:
Вместо того, чтобы поддерживать 2 отдельных экземпляра Handler
и исполняемый файл, мы можем поддерживать только 1 экземпляр задания.
Всякий раз, когда мы хотим запустить задачу, которая выполняется через X секунд (в данном случае 10 секунд), мы можем просто отменить ранее запущенный экземпляр задания (это необязательно, просто чтобы избежать несогласованных состояний) и создать новый экземпляр задания и получить ссылку на это.
Метод задержки, используемый в задании, приостанавливает задачу на X секунд (в данном случае на 10 секунд), а затем возобновляет выполнение после нее. И если мы хотим отменить промежуточную задачу, мы можем просто отменить задание! Довольно чисто и просто, не правда ли?
Поскольку сопрограммы и задания считаются легковесными, создание новых заданий каждый раз не окажет существенного влияния на производительность. Мы также можем использовать нужный диспетчер (например, Dispatchers.IO
) для выполнения задачи, поэтому нет необходимости предоставлять фиксированный экземпляр Looper
, как в случае обработчика, что делает код более удобным для потоков и с меньшим количеством ошибок!
Хотя у Handler есть свои варианты использования, мы, безусловно, можем использовать над ним Coroutines и Jobs для аккуратного выполнения задач, рассчитанных по времени.
Что вы думаете об этом подходе? Хотели бы вы еще улучшить его? Вас что-то беспокоит?