Create timer android studio

Таймер — классы Timer и TimerTask

Классы Timer и TimerTask из пакета java.util позволяют планировать запуск задания на определённое время в будущем. Вы можете создать поток, выполняющий в фоновом режиме и ожидающий заданное время. Когда время истечёт, задача, связанная с этим потоком, будет запущена. С помощью параметров можно запланировать задачу на повторяющий запуск либо на запуск по определённой дате. Вам не нужно создавать поток с помощью класса Thread, так как таймер упрощает эту задачу.

Учитывайте обстоятельство, что таймер выполняется в своём потоке и не должнен задействовать UI-элементы, которые выполняются в своём потоке. Для решения этой проблемы можете использовать метод runOnUiThread() для обновления данных у компонентов.

Классы Timer и TimerTask работают в связке. Класс Timer используется для планирования выполнения задачи. Запланированная к выполнению задача должна быть экземпляром класса TimerTask. Вы сначала создаёте объект класса TimerTask, а затем планируете его запуск с помощью класса Timer.

Класс TimerTask реализует интерфейс Runnable и может быть использован для создания потока выполнения.

В классе TimerTask имеется абстрактный метод run(), который следует переопределить. Метод должен содержать исполняемый код.

Метод cancel() прерывает задание и возвращает значение true, если выполнение задания прервано.

Метод scheduleExecutionTime() возвращает время, на которое последний раз планировался запуск задания.

Как только задача создана, она планируется для выполнения объектом класса Timer.

Методы класса Timer:

  • void cancel() — прерывает поток таймера
  • int purge() — удаляет прерванные задания из очереди таймера
  • void schedule (TimerTask task, long delay) — задание task планируется к выполнению через период в миллисекундах, переданный в параметре delay
  • void schedule (TimerTask task, long delay, long period) — задание task планируется к выполнению через период в миллисекундах, переданный в параметре delay. Затем задание повторяется повторно периодически — каждые period миллисекунд
  • void schedule (TimerTask task, Date when) — задание task планируется на время, указанное в параметре when
  • void schedule(TimerTask task, Date when, long period) — задание task планируется на время, указанное в параметре when. Затем задание выполняется повторно периодически — каждые period миллисекунд
  • void scheduleAtFixedRate (TimerTask task, long delay, long period) — задание task планируется к выполнению через период в миллисекундах, переданный в параметре delay. Затем задание выполняется повторно периодически — каждые period миллисекунд. Время каждого повтора задаётся относительно первого запуска.
  • void scheduleAtFixedRate (TimerTask task, Date when, long period) — задание task планируется к выполнению на время, указанное в параметре when. Задание затем выполняется повторно периодически — каждые period миллисекунд. Время каждого повтора задаётся относительно первого запуска.

Между методами schedule() и scheduleAtFixedRate() есть небольшая разница, которая заключается в разном поведении, которое зависит от стартовой точки запуска. Так второй метод работает как startTime + iterationNumber * delayTime и помнит время запуска. А обычный метод schedule() помнит последнее время выполнения и работает по формуле lastExecutionTime + delayTime. Для быстрых операций это не сильно отличается, а при ресурсоёмких задач разница будет заметна, например, при работе сборщика мусора приложение может притормозить и следующая задача может запуститься чуть позже.

Как только объект класса Timer создан, запуск планируется вызовом его метода schedule() и его родственника (см. выше).

Запускаем таймер

Напишем простой пример. Подготовим разметку.

Будем использовать два варианта таймера — одиночное и периодическое срабатывание.

Генерируем случайные показания

Допустим нам нужны ежедневные показания термометра. Но мы не можем ждать весь день при написании программ. Поэтому мы можем случайным образом создавать показания с небольшим интервалом и проверить поведение приложения.

Читайте также:  Куда удаляются файлы андроид

Для удобства создадим отдельный класс-утилиту.

Создадим в классе активности метод для генерации значений и вызовем в onCreate().

Источник

Таймер с ручным запуском

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

Но отличия от стандартного решения заключались, в следующем:

  • Во-первых, если задача не смогла выполниться, тут же необходимо повторить её. И так, до победного конца. После этого, возвращаемся в штатный режим.
  • Во-вторых, может возникнуть необходимость запустить задачу вручную, не дожидаясь наступления следующего срабатывания таймера.
  • И в-третьих, таймер должен запуститься в том случае, если устройство перезагружено, или была восстановлена связь с интернетом.

Задача была решена следующим образом.

Напишем тестовое приложение.Создайте проект, с пустой активностью.

Создадим новый IntentService, с именем UniversalService.

В MainActivity внесем изменения в onCreate:

И добавим метод:

В данном коде (в методе onCreate), мы сохраняем в Общие Настройки, с именем «AlertTest», состояние чекбоксов, и (в методе setServiceAlarm) запускаем таймер с периодичностью 5 секунд, на выполнение службы UniversalService.

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

Для этого добавим в MainActivity класс:

И в конец onCreate добавим:

А в UniversalService поменяем код на следующий:

Как видите, метод verify, эмулирует нашу задачу. В том случае, если она выполнена неуспешно — создается Intent, запускающий MyBroadRec, который опять стартует нашу службу. Настроить мы можем через чекбокс «Очень важная опция». Если мы переведем чекбокс «Автоматический запуск» в неактивное состояние, то работа таймера будет прекращена. Как только задача будет выполнена — переходим в штатный режим.

Но у нас еще осталась задача автозапуска нашего приложения. Для этого создаем класс UniversalReceiver наследующий от BroadcastReceiver:

И в манифесте добавляем следующие строки:

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

Источник

Create timer android studio

Для того, чтобы в фоновом режиме выполнить отчет времени, по истечению которого в вашем приложении должно произойти какое либо событие, можно использовать встроенный класс Timer и TimerTask. Сам класс Timer служит исключительно для отсчета времени, он может работать в двух режимах: одноразовое выполнение задания, либо же повторяющееся действие (например, напоминание, что у вас не лицензионная версия антивируса :). Метод TimerTask используется для описания действий, которые должны происходить по истечению времени отсчета в таймере Timer. То есть, здесь реализуется визуальное проявление работы таймера, иначе он просто будет считать себе в фоне и все без толку, никто о нем даже не узнает.

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

Создаем новый проект, выбираем Blank Activity. В файле activity_main.xml создаем интерфейс нашего приложения:

Теперь вся остальная работа будет происходить с помощью кода в MainActivity.java. Здесь мы выполняем стандартные шаги: объявляем используемые объекты, связываемся с элементами интерфейса. Ну и задаем Timer и метод для выполнения задачи по истечению таймера TimerTask:

Вот так выполняется реализация системного Android Timer. Пробуем запустить и смотрим на результат:

Теперь сделаем немного сложнее — при истечении 5 секунд в таймере будем запускать второе окно приложения. Как создать второе окно и выполнять на него переход мы уже детально разбирали раньше.

Как вы уже поняли, все изменения будут касаться лишь времени таймера:

и описания действий в методе MyTimerTask :

Запускаем и тестируем:

Переход выполнен успешно! Как видите, Android Timer довольно простая и интересная вещь, теоретически в метод TimerTask можно запихнуть что угодно. Поэкспериментируйте! А еще освойте счетчик обратного отсчета CountDownTimer.

Источник

Working with Countdown Timer in Android Studio Using Kotlin

Mar 7, 2020 · 6 min read

Читайте также:  Shapeshift os android 11

This tutorial shows you how to implement a countdown timer from scratch using android studio.

Before we dive into the whole technical aspect of this tutorial let’s try and understand what a countdown is or the need for a countdown timer.

What is a countdown?

A countdown is an act of counting down numerals in reverse o rder to zero. We all make use of countdown in our daily lives, is it when you and couple of friends are playing hide-and-seek or when you heat a delicious meal in the microwave or when Lebron James hit a clutch three pointer to win the championship as the clock winds down to 0.

There are lot of examples of times and moment we make use of countdown timers, the famous one we all know is at the launch of a rocket going to space or the countdown to a new year .

So we can see countdown timers are really important. Let get down to coding shall we.

How to implement the countdown timer from scratch using Kotlin on Android Studio

Before going ahead with this tutorial I’m assuming you having basic understanding of Kotlin programming and android studio.

Lets get to work!

1. Start a new project on Android studio

Select the empty activity so we would be able to create our own views

2. Configure your Project

You can name your app whatever like, i would be using CountdownApp

3. Lets design our view

Android development make use of the XML coding to design views for android apps.

So we are making use of the constraintlayout an EditText which takes our input, A TextView to display the progress of our timer and 2 Button to pause and cancel our Timer. Our second button is invisible because we want to only show that button whenever the timer is paused.

Now our app looks like this

5. Kotlin code for the Countdown Timer

Explanation of code

The Countdown timer package in android takes in time in milliseconds, so we had to convert our time to milliseconds and 1 minute equal to 60000 milliseconds.

start_mili_seconds initializes our timer text to start countdown from one minute in the absent of an inputted minute. The is_running variable helps us check if our timer is running so we are able to change the button text and also make the reset button visible whenever the is_running variable is true.

On click of the button that triggers the timer, we check if is_running is true we run the pauseTimer() function which changes the button text to pause and makes the reset button visible and also pause the timer, or else it takes the text from the EditText and converts it to a milliseconds and pass it as a parameter to the startTimer() function which then start our timer.

The startTimer() function consist of the whole logic we need to start our countdown, first we create a global variable:

which makes out CountDownTimer class available where we need it, now we need to initialize the countdown_timer

we make use of object declaration to initialize our CountDownTimer class which takes in 2 arguments:

  1. The time you intend to countdown in seconds and for us we named it as time_in_seconds
  2. The amount of time reduced in seconds, here we are using 1000 that’s per milliseconds reduce the time_in_seconds

It has two (2) implemented methods which are the onTick() and onFinish()

The onTick updates our UI text ( Textview) on the time remaining for the countdown to reach zero.

The updateTextUI() function converts our time_in_milliseconds and display it in actual minute and seconds so the user is able to understand and monitor the countdown timer.

Once the countdown is finished the onFinish() loads a confetti function which displays konfetti around the screen for successful completion of the countdown

Читайте также:  Changecsc samsung free tool android 11

To be able to use the Konfetti in your app you need to add this to your build.gradle file

and also add this to your MainActivity.kt file

Now that we have our countdown and konfetti. we want to be able to reset our timer when we want and that’s why we have the resetTimer() function

This function resets our timer back to 0 and hides the reset button so we start the timer all over again.

Источник

Выполнение задач в бэкграунде

На Stackoverflow часто встречаются вопросы по выполнению на Android фоновых задач, в т.ч. и повторяющихся с заданным промежутком времени. Как правило, первое, что используется, это Service.

Такой подход в некоторых случаях может привести к тормозам и низкой скорости ответа пользовательского интерфейса. Расскажу когда так бывает и как с этим бороться…

Почему может «тормозить» Service

Каждое Android-приложение по-умолчанию запускается в отдельном процессе. В каждом процессе запускаются потоки (Thread). По-умолчанию все компоненты приложения (Activity, Service, BroadcastReceiver) запускаются в одном «main» потоке (он же UI-thread). Если внутри сервиса запустить, например, долгий сетевой вызов или какую-то тяжелую инициализацию, мы получим тормоза всего приложения, его интерфейса и, скорее всего, предложение сделать Force close… Впрочем, работа службы в том же потоке, что и остальное приложение, имеет свои плюсы — у вас есть доступ к элементам интерфейса. Если бы служба работала в другом потоке, доступ к UI у вас бы отсутствовал.

Что делать?

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

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

  • создать Thread
  • использовать AsyncTask

Запускаем свой поток

Поток создать просто…

Все просто, но проблемы начинаются, когда после выполнения длинного задания нам захочется обновить UI.

В результате выполнения получим ошибку. «Чужой» поток попытался обратиться к UI! Как вылечить? Надо использовать Handler. Доработаем код…

AsyncTask — все проще

Для реализации подобных задач в Android SDK имеет встроенное средство — AsyncTask. Данный класс позволяет не думать о том, в каком потоке выполняется ваш код, все происходит автоматически. Рассмотрим пример выше переписанный на AsyncTask.

Метод doInBackground будет выполнен в отдельном потоке, результат его выполнения будет передан в метод onPostExecute, который, в свою очередь будет выполнен на UI-Thread’е
Следует помнить, что:

  • AsyncTask может выполняться лишь раз. Для повторного запуска нужно пересоздать класс;
  • execute() должен быть выполнен на UI-Thread’е.

А что делать, если задачу нужно выполнять регулярно, через определенные промежутки времени…

Таймер. Самый простой подход к периодическому запуску.

Java предоставляет Timer для запуска повторяющихся задач. Сделаем так, чтобы AsyncTask из предыдущего примера выполнялся раз в минуту…

Стоит заметить, что все упрощается если «долгоиграющая» задача не требует доступ к UI. В этом случае не требуются ни Handler’ы, ни AsyncTask’и.

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

Более гибкий способ. ScheduledThreadPoolExecutor.

Класс ScheduledThreadPoolExecutor указан как рекомендуемая альтернатива использованию Timer. Данный класс позволяет организовать пул потоков и планировать выполняемые задачи относительно него. Т.е. класс для организации очереди заданий один, но тем не менее он может выполнять одновременно несколько заданий, если это позволяет имеющееся количество доступных потоков. Более подробно о преимуществах — в документации.

Для каждого заплаированного задания доступен его «дескриптор» — ScheduledFuture с помощью которого можно, например, отменить выполнения одного конкретного задания не трогая весь остальной пул.

Задание со звездочкой. Велосипед. Thread, Looper, Handler.

А еще можно собрать свой велосипед поток с очередью.

Данный поток, будучи единожды запущенным, выполняется вечно. Для общения с ним (отправки заданий) можно использовать метод getHandler() для получения хандлера и дальнейшей отправкой «событий» в него. CountdownLatch используется для синхронизации, чтобы поток, желающий получить Handler, не получил его ранее того момента, когда поток-работник запустится и Handler буде создан.

Источник

Оцените статью