Как сделать таймер в android studio

Добавил пользователь Евгений Кузнецов
Обновлено: 04.10.2024

Может ли кто-нибудь привести простой пример обновления текстового поля каждую секунду или около того?

Я хочу сделать летающий шар и должен вычислять/обновлять координаты шара каждую секунду, поэтому мне нужен какой-то таймер.

Я ничего отсюда не получаю .

1 ответ

Я пытаюсь сделать простую игру в android. Мне нужно сделать таймер, который может быть независимым от системного времени. Чтобы убедиться, что изменения системного времени пользователя не влияют на таймер игры. Мне нужна идея, как это сделать? Заранее спасибо.

Я просто хочу установить таймер для записанного голоса. Так что после этого времени он приходит как сигнал тревоги.(точно так же, как уведомления). Возможно ли это?. Любая помощь будет очень признательна. заранее спасибо

Вот что я считаю предпочтительным методом.

Как установить таймер, скажем, на 2 минуты, чтобы попытаться подключиться к базе данных, а затем выбросить исключение, если есть какие-либо проблемы в соединении?

Я разрабатываю приложение iPhone с использованием cocos2d и box2d.In это приложение мне нужно, чтобы установить таймер. Таймер покажет оставшееся время в руке игрока, чтобы добраться до места назначения. как я могу сделать that. i нарисовал сцену, но не уверен, как я новичок, как добавить.

Это просто! Вы создаете новый таймер.

Затем вы расширяете задачу таймера

А затем добавьте новую задачу в таймер с некоторым интервалом обновления

Отказ от ответственности: Это не идеальное решение. Это решение с использованием класса Timer (как просил OP). В Android SDK рекомендуется использовать класс обработчика (пример есть в принятом ответе).

Если вы просто хотите запланировать обратный отсчет до определенного времени в будущем с регулярными уведомлениями об интервалах по пути, вы можете использовать класс CountDownTimer, который доступен с API уровня 1.

Это какой - то простой код для таймера:

Я думаю, что вы можете сделать это таким образом, как:

И отменить это, как:

Потому что этот вопрос все еще привлекает много пользователей из поиска Google(около Android таймеров) Я хотел бы вставить свои две монеты.

Прежде всего, класс Timer будет устарел в Java 9 (прочитайте принятый ответ) .

Официальный предложенный способ-использовать ScheduledThreadPoolExecutor , который является более эффективным и многофункциональным, который может дополнительно планировать выполнение команд после заданной задержки или выполнять их периодически. Кроме того,это дает дополнительную гибкость и возможности ThreadPoolExecutor.

Вот пример использования простых функций.

Создать службу исполнителя:

Просто запланируйте запуск:

Теперь вы можете использовать future , чтобы отменить задачу или проверить, выполнена ли она, например:

Надеюсь, вы найдете это полезным для создания задач в Android.

Я удивлен, что нет ответа, в котором упоминалось бы решение с RxJava2 . Это действительно просто и обеспечивает простой способ настройки таймера в Android.

Сначала вам нужно настроить зависимость Gradle, если вы еще этого не сделали:

Поскольку у нас есть простая, НЕПОВТОРЯЮЩАЯСЯ ЗАДАЧА , мы можем использовать объект Completable :

Для ПОВТОРЕНИЯ ЗАДАЧИ вы можете использовать Observable аналогичным образом:

Чтобы избежать нежелательных утечек памяти, вы должны отказаться от подписки при уничтожении активности/фрагмента.

для кого хочет сделать это в kotlin:

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

эта функция имеет много других опций, попробуйте ее

Вы хотите, чтобы ваши обновления UI происходили в уже существующем потоке UI.

Лучший способ-использовать обработчик, который использует postDelayed для запуска выполняемого объекта после задержки (каждый запуск планирует следующий); очистите обратный вызов с помощью removeCallbacks.

Вы уже ищете в нужном месте, поэтому посмотрите на него еще раз, возможно, выясните, почему этот пример кода не то, что вам нужно. (См. Также идентичную статью при обновлении UI с таймера ).

Он более простое решение, отлично работает в моем приложении.

Вот простой надежный способ.

Поместите следующий код в свою активность, и метод tick() будет вызываться каждую секунду в потоке UI, пока ваша активность находится в состоянии "resumed". Конечно, вы можете изменить метод tick(), чтобы он делал то, что вы хотите, или вызывался более или менее часто.

Для тех, кто заинтересован, код "_h0=_handler" необходим, чтобы избежать одновременного запуска двух таймеров, если ваша деятельность приостановлена и возобновлена в течение периода тика.

Вы также можете использовать для этого аниматора:

Для тех , кто не может полагаться на хронометр, я сделал класс полезности из одного из предложений:

Вам нужно создать поток для обработки цикла обновления и использовать его для обновления textarea. Сложная часть, однако, заключается в том, что только основной поток может фактически изменять пользовательский интерфейс, поэтому поток цикла обновления должен сигнализировать основному потоку об обновлении. Это делается с помощью обработчика.

Если кому-то интересно, я начал играть с созданием стандартного объекта для запуска в потоке activities UI. Кажется, все работает нормально. Комментарии приветствуются. Я бы хотел, чтобы это было доступно в конструкторе макетов в качестве компонента для перетаскивания в действие. Не могу поверить, что нечто подобное уже не существует.

В упражнении у меня есть это onStart:

Если у вас уже есть время дельты.

Я абстрагировал таймер и сделал его отдельным классом:

И извлеките основное действие из класса Timer как

И я использовал его именно так:

Я Надеюсь, Что Это Поможет

Я использую этот способ:

затем ниже onCreate

это простой способ решить эту проблему.

Похожие вопросы:

Я пытаюсь сделать простую игру в android. Мне нужно сделать таймер, который может быть независимым от системного времени. Чтобы убедиться, что изменения системного времени пользователя не влияют на.

Я просто хочу установить таймер для записанного голоса. Так что после этого времени он приходит как сигнал тревоги.(точно так же, как уведомления). Возможно ли это?. Любая помощь будет очень.

Как установить таймер, скажем, на 2 минуты, чтобы попытаться подключиться к базе данных, а затем выбросить исключение, если есть какие-либо проблемы в соединении?

Я разрабатываю приложение iPhone с использованием cocos2d и box2d.In это приложение мне нужно, чтобы установить таймер. Таймер покажет оставшееся время в руке игрока, чтобы добраться до места.

я новичок в асинхронной задаче android у меня действительно есть один простой вопрос.. пожалуйста, скажите мне, где искать, если этот вопрос был задан раньше я использую AsyncTask my doInBackground.

Привет планирую разработать и android таймер обратного отсчета приложение для этой деятельности с кнопкой Пуск и стоп, когда пользователь нажимает кнопку Пуск дисплей таймер обратного отсчета и.

Есть ли какой-нибудь способ установить таймер на 60 секунд с xor ah,ah Enter_Again: xor ah, ah ; I should put 60 seconds here int 16h ; The user should press S before 60 seconds mov bl,al cmp al,S

Подключаться к сервису мы теперь умеем. В этом уроке попробуем обменяться с ним данными.

В сервисе метод onBind возвращает объект, наследующий интерфейс IBinder. Проще всего использовать для этого объект Binder и расширить его необходимыми нам методами. Т.е. создаем свой класс MyBinder с предком Binder и рисуем в нем свои методы.

При биндинге, в методе onServiceConnected мы получаем объект Binder. Мы можем привести его к типу MyBinder (из сервиса) и вызывать его методы, а реализация будет срабатывать в сервисе, где мы описывали этот класс.

Как вы понимаете, это сработает только, если сервис и приложение выполняются в одном процессе. Поэтому такой биндинг называется локальным.

Нарисуем пример. У нас будет сервис, который с определенным интервалом будет что-то выводить в лог. Мы к нему подключимся, и будем повышать или понижать интервал и получать новое значение интервала обратно.

Project name: P0981_ServiceBindingLocal
Build Target: Android 2.3.3
Application name: ServiceBindingLocal
Package name: ru.startandroid.develop.p0981servicebindinglocal
Create Activity: MainActivity

Добавим в strings.xml строки:

Экран main.xml:

Кнопки для запуска сервиса, повышения интервала и понижения интервала.

Создаем сервис MyService.java:

Здесь мы используем таймер – Timer. Он позволяет повторять какое-либо действие через заданный промежуток времени. Кратко распишу принцип действия. TimerTask – это задача, которую Timer будет периодически выполнять. В методе run – кодим действия этой задачи. И далее для объекта Timer вызываем метод schedule, в который передаем задачу TimerTask, время через которое начнется выполнение, и период повтора. Чтобы отменить выполнение задачи, необходимо вызвать метод cancel для TimerTask. Отмененную задачу нельзя больше запланировать, и если снова надо ее включить – необходимо создать новый экземпляр TimerTask и скормить его таймеру.

Итак, в методе onCreate мы создаем таймер и выполняем метод schedule, в котором стартует задача.

Метод schedule проверяет, что задача уже создана и отменяет ее. Далее планирует новую, с отложенным на 1000 мс запуском и периодом = interval. Т.е. можно сказать, что этот метод перезапускает задачу с использованием текущего интервала повтора (interval), а если задача еще не создана, то создает ее. Сама задача просто выводит в лог текст run. Если interval = 0, то ничего не делаем.

Метод upInterval получает на вход значение, увеличивает interval на это значение и перезапускает задачу. Соответственно задача после этого будет повторяться реже.

Метод downInterval получает на вход значение, уменьшает interval на это значение (но так, чтоб не меньше 0) и перезапускает задачу. Соответственно задача после этого будет повторяться чаще.

onBind возвращает binder. Это объект класса MyBinder.

MyBinder расширяет стандартный Binder, мы добавляем в него один метод getService. Этот метод возвращает наш сервис MyService.

Т.е. в подключаемом Activity, в методе onServiceConnected мы получим объект, который идет на выход метода onBind. Далее преобразуем его к типу MyBinder, вызовем getService и вуаля - у нас в Activity будет ссылка на объект-сервис MyService.

Кодим MainActivity.java:

Жмем Start – запускаем сервис. В логах:

MyService onCreate
MyService onBind
MainActivity onServiceConnected

Создается сервис, и мы к нему подключаемся. Биндинг был ранее вызван в onStart и, когда сервис стартанул, мы автоматически подключились. В прошлом уроке мы разбирали такую ситуацию, когда биндинг идет к незапущенному пока сервису.

Далее с интервалом в одну секунду в лог падает текст run.

Попробуем увеличить интервал. Жмем Up.


На экране появилось текущее значение интервала. И по времени записей в логах видим, что именно с этим интервалом срабатывает задача (вывод текста run в лог) .

Далее можно нажимать Up и Down и наблюдать, как меняется интервал выполнения задачи. Таким образом, мы из Activity подключились к сервису и управляем его работой.

В начале урока я отметил, что все это будет работать, если приложение и сервис в одном процессе. Если же они в разных процессах, то используется немного более сложный вариант для обмена данными. Но это гораздо менее используемый случай, поэтому сейчас я про него не рассказываю. Но попозже об этом обязательно будет статья.

На следующем уроке:

- шлем уведомление из сервиса

- в чатах решаем возникающие вопросы и проблемы по различным темам: Android, Kotlin, RxJava, Dagger, Тестирование

- ну и если просто хочется поговорить с коллегами по разработке, то есть чат Флудильня

- новый чат Performance для обсуждения проблем производительности и для ваших пожеланий по содержанию курса по этой теме

Класс java.util.Timer является служебным и может быть использован для отложенного запуска потока в определенное время. Класс Java Timer может быть использован для запланированной задачи, которая должна будет выполниться один раз или запускаться регулярно в определенное время.

Класс java.util.TimerTask является абстрактным классом, который реализует интерфейс Runnable. Мы должны унаследоваться от этого класса, создавая наш собственный TimerTask.

  • Класс Timer является потокобезопасным, поэтому несколько потоков могут совместно использовать один объект Timer без необходимости внешней синхронизации.
  • Класс Timer использует java.util.TaskQueue для выполнения задач с определенной периодичностью.
  • В одно и то же время может быть выполнен только один поток TimerTask. Например, если вы создаете Timer, который должен запускаться каждые 10 секунд, но выполнение одного потока занимает целых 20 секунд, то объект Timer будет добавлять задачи в очередь пока один поток не закончит свое выполнение. Как только он отработает свои 20 секунд, то об этом будет уведомлена очередь и следующий поток из этой очереди начнет работать.

Класс Timer использует методы wait() и notify() для планирования задач.

Java Timer и TimerTask. Практика

Давайте на примере рассмотрим использование Timer и TimerTask в Java:

Обратите внимание, что выполнение одного потока будет длиться 20 секунд, а объект Timer запланирован запускаться каждые 10 секунд. Вот результат выполнения программы:

Результат выполнения подтверждает, что если задача уже выполняется, то Timer будет ждать её до конца. Когда он закончил одну задачу, то сразу же начнет следующую задачу из очереди.

Метод cancel() класса Timer используется для завершения выполнения таймера и отказа от дальнейшего выполнения любых запланированных задач. Однако это не мешает ему дать закончить выполнение текущей задачи. Если таймер работает в демона, то будет прекращен, как только все пользовательские потоки закончат свое выполнение.

Класс Таймер содержит несколько методов schedule() , чтобы запланировать задачу на одноразовое выполнение в указанное время или регулярное выполнение с определенной задержкой. Есть несколько методов scheduleAtFixedRate () для периодического запуска задачи с определенным интервалом.

Вот и все, что нужно знать о работе с Java Timer и TimerTask в Java. Следите за обновлениями сайта и разделом Многопоточность в Java.

Используя таймер Java и TimerTask, чтобы получить максимальную отдачу от этого. Запланируйте отложенную разовую задачу, ежедневную задачу или просто повторите ее с интервалом. Холодные бобы.

1. Таймер – Основы

Timer и TimerTask – это классы java util, используемые для планирования задач в фоновом потоке. В нескольких словах – TimerTask – это задача, которую нужно выполнить, и Timer – это планировщик .

2. Запланируйте задачу один раз

2.1. После заданной задержки

Давайте начнем с простого выполнения одной задачи с помощью Таймер :

Теперь это выполняет задачу после определенной задержки , заданной в качестве второго параметра метода schedule () . В следующем разделе мы рассмотрим, как запланировать задачу на заданную дату и время.

Обратите внимание, что если мы запускаем этот тест JUnit, мы должны добавить Thread.sleep(задержка * 2) вызов, позволяющий потоку Таймера выполнить задачу до того, как тест Junit прекратит выполнение.

2.2. В Заданную Дату и время

На этот раз давайте представим, что у нас есть старая устаревшая база данных, и мы хотим перенести ее данные в новую базу данных с лучшей схемой.

Мы могли бы создать задачу Миграции базы данных класс, который будет обрабатывать эту миграцию:

Для простоты мы представляем две базы данных с помощью List из String . Проще говоря, наша миграция состоит из переноса данных из первого списка во второй.

Чтобы выполнить эту миграцию в нужный момент, нам придется использовать перегруженную версию метода schedule () |/:

Как мы видим, мы передаем задачу миграции, а также дату выполнения в метод schedule () .

Затем миграция выполняется в момент, указанный двумя секундами позже :

Пока мы находимся до этого момента, миграция не происходит.

3. Запланируйте Повторяемую задачу

Теперь, когда мы рассмотрели, как планировать однократное выполнение задачи, давайте посмотрим, как справляться с повторяющимися задачами.

Еще раз, есть несколько возможностей, предлагаемых классом Timer : мы можем настроить повторение для наблюдения либо фиксированной задержки, либо фиксированной скорости.

Фиксированная задержка означает, что выполнение начнется через некоторое время после момента последнего запуска выполнения, даже если оно было отложено (следовательно, само по себе задерживается) .

Допустим, мы хотим запланировать какую-то задачу каждые две секунды, и что первое выполнение занимает одну секунду, а второе-две, но задерживается на одну секунду. Затем третья казнь начнется на пятой секунде:

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

Давайте повторим наш предыдущий пример, с фиксированной скоростью, вторая задача начнется через три секунды (из-за задержки). Но, третий через четыре секунды (соблюдая первоначальный график одного выполнения каждые две секунды):

Эти два принципа рассматриваются, давайте посмотрим, как их использовать.

Для использования планирования с фиксированной задержкой существуют еще две перегрузки график() метод, каждый из которых принимает дополнительный параметр, указывающий периодичность в миллисекундах.

Почему две перегрузки? Потому что все еще есть возможность запустить задачу в определенный момент или после определенной задержки.

Что касается планирования с фиксированной скоростью, у нас есть два метода scheduleAtFixedRate () , которые также имеют периодичность в миллисекундах. Опять же, у нас есть один метод, чтобы запустить задачу в заданную дату и время, и другой, чтобы запустить ее после заданной задержки.

Также стоит упомянуть, что, если выполнение задачи занимает больше времени, чем период, он задерживает всю цепочку выполнения, независимо от того, используем ли мы фиксированную задержку или фиксированную скорость.

3.1. С фиксированной задержкой

Теперь давайте представим, что мы хотим внедрить систему рассылки новостей, отправляя электронное письмо нашим подписчикам каждую неделю. В этом случае повторяющаяся задача кажется идеальной.

Итак, давайте планировать рассылку каждую секунду, что в основном является спамом, но поскольку отправка поддельная, мы готовы к работе!

Давайте сначала разработаем задачу Рассылка новостей :

Тогда что, если мы хотим планировать эту задачу каждую секунду в режиме фиксированной задержки? Нам придется использовать перегруженную версию schedule () , о которой мы говорили ранее:

Конечно, мы проводим тесты только для нескольких случаев:

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

3.2. С Фиксированной ставкой

Теперь, что, если бы мы использовали повторение с фиксированной скоростью? Тогда нам придется использовать метод scheduleatfixedrate() :

На этот раз выполнение не задерживается предыдущими :

3.3. Запланируйте ежедневное задание

Далее, давайте запускать задачу один раз в день :

4. Отмена таймера и таймертаска

Выполнение задачи может быть отменено несколькими способами:

4.1. Отмените Таймертаск внутри запуска

Вызывая метод TimerTask.cancel() внутри реализации метода run() самого метода TimerTask/|:

4.2. Отмена таймера

Вызывая метод Timer.cancel() на Таймер объект:

4.3. Остановите поток TimerTask Внутри Run

Вы также можете остановить поток внутри метода run задачи, тем самым отменив всю задачу:

Обратите внимание на инструкцию TODO в реализации run – чтобы запустить этот простой пример, нам нужно будет фактически остановить поток.

В реальной реализации пользовательского потока должна поддерживаться остановка потока, но в этом случае мы можем игнорировать устаревание и использовать простой stop API для самого класса потока.

5. Таймер против ExecutorService

Вы также можете эффективно использовать службу ExecutorService для планирования задач таймера вместо использования таймера.

Вот краткий пример того, как выполнить повторную задачу с заданным интервалом:

Итак, каковы основные различия между решением Time и решением ExecutorService :

  • Таймер может быть чувствителен к изменениям в системных часах; ScheduledThreadPoolExecutor не является
  • Таймер имеет только один поток выполнения; ScheduledThreadPoolExecutor может быть настроен с любым количеством потоков
  • Исключения времени выполнения, создаваемые внутри TimerTask , убивают поток, поэтому следующие запланированные задачи не будут выполняться дальше; с ScheduledThreadExecutor – текущая задача будет отменена, но остальные будут продолжать выполняться

6. Заключение

Этот учебник проиллюстрировал множество способов, которыми вы можете использовать простой, но гибкий Timer и TimerTask инфраструктура, встроенная в Java, для быстрого планирования задач. Конечно, в мире Java есть гораздо более сложные и полные решения, если они вам нужны, такие как библиотека Quartz , но это очень хорошее место для начала.

Реализацию этих примеров можно найти в проекте GitHub – это проект на основе Eclipse, поэтому его должно быть легко импортировать и запускать как есть.

Читайте также: