Страницы

Поиск по вопросам

среда, 1 января 2020 г.

Для чего нужен Timer? Если есть Handler и Executor?

#java #android


Для чего нужен Timer? Если есть Handler и Executor?

С Таймером всегда какие то траблы. То не в основном потоке, то не запускается потому
что timer не успел запуститься на 10 милисекунд. Короче просто ужас.

А Handler чем то на Event похож.
    


Ответы

Ответ 1



Handler - это фишка только для Android-а. С его помощью можно выполнять блоки кода, завёрнутые в Runnable, отложено, а также отложено на заданное время в Looper потоках, таких как UI-поток в Android. Executor - это лишь интерфейс, который по-разному используется классами расширяющими его. Например выполнить метод через execute сразу же, отложено или в соседнем потоке, на усмотрение разработчика и того, как он реализует класс, расширяющий этот интерфейс. Timer - класс, изначально предназначенный для выполнения блока кода, оборачиваемого в TimerTask, который кстати расширяет Runnable, в фоновом потоке. У него достаточно функционала, для решения исторически накопившихся, часто возникающих задач, связанных с выполнением кода в фоновом потоке, уJava-разработчиков. И эти задачи до Timer нельзя было решить быстро и удобно в пару строк кода, в виду отсутствия среди стандартных компонентов Java удобного Handler, который существует благодаря Looper-архитектуре UI-потока в Android. Это лишь интерпретация событий, которая возникла при прочтении описаний к этим классам и интерфейсу. UDP: Моё личное мнение таково, что с помощью Handler можно решить множество задач не прибегая к Timer. Пример отложенного запуска и его отмены в ответе тут. Пример повтора блока кода множество раз с заданным интервалом по времени в ответе тут. Пример повтора блока кода до определенного события в ответе тут. Пример когда это может понадобиться в ответе тут. Если в указанных примерах возник вопрос, то не забывайте, что вызвать отложенный запуск с помощью Handler можно и через обращение к View, например так mView.post(...); и mView.postDelayed(...); Но могут возникнуть проблемы с Handler при необходимости выполнять тяжелые задачи в фоновом потоке, ведь использование Handler требует Looper потока. В некоторых случаях для решения подобных задач использование Timer может оказаться более удобным. Но всегда можно создать собственный Looper поток, например HandlerThread, который содержит в себе Looper. В конечном итоге удобство использования компонентов, будь то Handler или Timer, собственный AsyncTask или сторонние компоненты, зависит от поставленной задачи.

Комментариев нет:

Отправить комментарий