Android цикл с задержкой

Класс Handler

Класс android.os.Handler является дальнейшим развитием потоков, упрощающий код. Handler может использоваться для планирования выполнения кода в некоторый момент в будущем. Также класс может использоваться для передачи кода, который должен выполняться в другом программном потоке.

Рассмотрим максимально простой пример для знакомства

Запустите пример на эмуляторе и через некоторое время закройте его через кнопку Назад или Домой. При этом смотрите на логи на вкладе Android Monitor. Вы увидите, что приложение по-прежнему печатает текст типа после секундной задержки после запуска.

Разберёмся, что происходит и как следует читать код.

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

Приложение запустилось, сразу же запоминаем время через currentTimeMillis() — это опорная точка отсчёта.

Основная логика заключена в условии if — тут пишется то, что мы хотим поместить в новый поток. Не страшно, если не понятно, как это всё работает. Просто уясните принцип. Мы иницилизируем объект mHandler и сразу начинаем его настраивать. Переопредляем его главный метод handleMessage() и вызываем метод суперкласса. Это ничем не отличается от вызова onCreate() активности, мы не раз такое делали.

Блок if позволяет управлять кодом для потока. Сам запуск мы сделаем позже. А в самом блоке мы снова получаем текущее время и сравниваем с самой первым временем, полученным во время запуска. Для удобства вычисления идут в секундах. Результат выводится в лог. Метод sendEmptyMessageDelayed() сообщает системе, что мы хотим повторять код в handleMessage() раз в секунду.

После инициализации и настройки mHandler мы присваиваем значение true переменной gameOn, показывая готовность к запуску кода из блока if.

Последняя строка sendEmptyMessage() запускает поток.

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

Периодическое выполнение задачи

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

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

Кроме метода postDelayed() вы можете использовать метод postAtTime():

В этом случае объект r добавляется в очередь сообщений, запуск объекта производится во время, заданное вторым параметром.

Самый простой способ помещения объекта в очередь — метод post(), когда указывается только помещаемый объект без указания времени выполнения объекта:

Пример с индикатором прогресса

Всё, что вам нужно — создать экземпляр класса Handler в классе активности. Поток будет работать с объектом Handler, который в свою очередь, будет обновлять шкалу индикатора в основном потоке активности.

Чтобы послать сообщение в объект Handler, сначала необходимо вызвать метод obtainMessage(), чтобы извлечь объект Message из глобального пула сообщений.

Для вставки сообщения в очередь сообщений объекта Handler существует несколько методов:

  • sendMessage() — помещает сообщение в очередь немедленно (в конец очереди)
  • sendMessageAtFrontofQueue() — помещает сообщение в очередь немедленно и, кроме того, помещает это сообщение впереди очереди (по умолчанию оно ставится в конец очереди), таким образом ваше сообщение берет приоритет над всеми другими
  • sendMessageAtTime() — помещает сообщение в очередь в установленное время в миллисекундах
  • sendMessageDeiayed() — помещает сообщение в очередь после задержки, выраженной в миллисекундах

Чтобы обрабатывать эти сообщения, для объекта Handler необходимо реализовать метод обратного вызова handleMessage(), который будет вызываться каждым сообщением из очереди сообщения.

Читайте также:  Андроид будильник не срабатывает почему иногда

Для примера создадим приложение с ProgressBar, который будет отображать ход выполнения длительной задачи (это будет простой цикл с приостановкой потока на 1 секунду в каждой итерации цикла) и обновлять степень завершения этой задачи через объект Handler в классе активности.

Splash-screen

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

Источник

Добавить задержку цикла в Android без остановки потока пользовательского интерфейса

Я просматривал документы Android Studio и документы StackOverflow, но не могу найти способ сделать эквивалент того, что делается в IOS: Добавление задержки в цикле A без блокировки пользовательского интерфейса в Android.

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

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

Код, который я использую, структурирован так:

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

Как бы я задержал цикл, чтобы пользователь мог видеть, что происходит?

Текущее состояние (после moveCard ()) должно отображаться в течение x мс, прежде чем идти по логике цикла while.

Это делается до тех пор, пока не будет достигнуто конечное состояние.

Затем начинается следующее действие.

3 ответа

Может быть, создание чего-то подобного должно работать,

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

Это немедленно запустит таймер с задержкой 500 мс между триггерами. Каждый раз, когда таймер запускает метод run() в TimerTask будет выполняться.

Создайте таймер в onCreate , запустите / запланируйте его в onResume , остановите в onPause . Внутри метода runr (TimerTask) вы перемещаете логику вашей программы.

MoveCard () и ждите, чтобы перейти к новому намерению:

Источник

Задержка выполнения цикла

Задержка выполнения кода на несколько секунд
Здравствуйте. Как прервать выполнение кода на некоторое количество секунд? Ну например, вводит.

Задержка выполнения кода на время выполнения анимации
Пишу игру с видом пошагового боя. С каждым ходом, игрок выкладывает на доску новую фигуру.

Задержка выполнения
Доброго всем Кто может подсказать, как можно прописать задержку выполнения функции (С#)? На двери.

Задержка выполнения
Здравствуйте. Подскажите как можно сделать задержку фокуса? Делаю так.

Решение

так делать не надо. Вы блочите UI поток.

rus_artur4ik, у любой view есть метод post/postDelayed.
Эти методы принимают в аргумент интерфейс Runnable, который помещается в стек UI-вызова.
Метод postDelayed принимает второй аргумент — время в миллисекундах. Это время через которое будет вызван runnable.

для этого есть кнопочка 😉

Задержка выполнения
Вот допустим у меня есть кнопка, как сделать что бы я на неё нажал и скажем через 2 секунды вылезло.

Задержка цикла while
У меня такой вопрос, будет ли срабатывать sleep() в цикле while если я буду в цикле делать.

Задержка выполнения программы
Ребята, помогите найти проблему плз.. Дело в том, что при запуске программы она висит 20 сек, и.

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

Задержка выполнения программы
подскажите пожалуйста, как на языке Java организовать задержку выполнения 2 сек? я уже запутался(((.

Источник

Русские Блоги

Несколько способов реализовать таймеры в Android

предисловие

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

Один из курсов упоминал AlarmManager. Этот класс был просто для того, чтобы понять, что это менеджер будильника. Если вы хотите сделать какое-то программное обеспечение, которое лучше, чем напоминания и будильники, вам нужно его использовать. Официальный пример используется для реализации таймера. Я внезапно почувствовал, что это очень волшебная вещь. Я собрал некоторую информацию и записал несколько известных мне способов реализации таймера, чтобы углубить свою память и поделиться ею со всеми.

Механизм сообщений Android

Давайте сначала разберемся с механизмом обработки сообщений Android

То есть механизм работы Handlerd. Для работы обработчика требуется поддержка базовых MessageQueue и Looper. MessageQueue (очередь сообщений), которая хранит некоторые сообщения внутри и обеспечивает внешние операции вставки и удаления в виде очереди (фактически хранилище единого списка). Looper (цикл сообщений), взаимодействуйте с MessageQueue для достижения непрерывного постановки в очередь и удаления из очереди сообщений.

Обработчики могут легко переключать задачи в другие потоки для выполнения, чтобы уменьшить нагрузку на основной поток, поэтому обработчики часто используются для обновлений пользовательского интерфейса. Вот только краткий обзор. Соответствующим блоггерам пока настоятельно не рекомендуется ссылаться на следующие блоги:
Android-механизм асинхронной обработки сообщений
Android AsyncTask полностью решен

Читайте также:  Vivo x50 android 12

Конечно, теперь есть лучшие способы обработки сообщений. Понимание обработчиков и Asynctask позволяет лучше понять механизм внутренней обработки сообщений Android.
Рекомендуется:EventBusСильно отделенный, код лаконичен и понятен, те, кто заинтересован, могут использовать его для справки.

текст

Я использую несколько классов для реализации таймеров: Handler, Timer, Thread, AlarmManager.

AlarmManager

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

Выше приведено основное использование таймера: сначала получите менеджер, затем определите флаг, время цикла и pendingIntent, выданные в указанное время.

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

Здесь нужно обратить внимание на настройку в отдельном процессе, который определяется android

Резюме преимуществ

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

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

3. Разнообразие времени, включая одно время, время цикла (выполняется в xx, xx, x, x, с понедельника по пятницу, который час каждый день . )

Применимая сцена

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

Handler

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

Каждый раз, когда таймер запускается, Handler.sendEmptyMessage (0), таймер запускается. Способ продолжения цикла и остановки уже написан в комментариях.

Резюме преимуществ

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

Применимая сцена

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

Timer

Таймер — это класс, в котором Android запускает таймер напрямую, и это также мой самый ранний класс инструментов, который может реализовать функцию таймера.

Его использование общеизвестно:

задержка: время задержки от начала таймера.
period: интервал таймера.

Резюме преимуществ

Использование Timer очень просто: TimerTask — это дочерний поток, который удобен для обработки сложной и трудоемкой функциональной логики, часто используется в сочетании с обработчиком.

Применимая сцена

По сравнению с таймером, реализованным самим обработчиком, таймер может выполнять некоторую сложную обработку. Например, ему нужно отсортировать список с большим количеством объектов. Выполнение в TimerTask не блокирует дочерний поток. Он часто используется в сочетании с обработчиком для завершения сложной обработки. После длительной операции обновите интерфейс пользовательского интерфейса через обработчик.

** Специально говоря: для некоторых мобильных телефонов, если вы обновляете поток пользовательского интерфейса непосредственно в TimerTask, он не будет сообщать об ошибке и работает нормально, но вы должны обратить внимание на то, что обновление пользовательского интерфейса должно выполняться в основном потоке, иначе вы знаете об этом при устранении неполадок. И эта вещь потребляет особую мощность, особенно мощность, особенно мощность. Важно сказать три раза, обязательно выключайте ее, когда она не используется, и используйте ее с осторожностью.
**

Читайте также:  Будильник для андроид не срабатывает

Thread

Поток реализует таймер, создав дочерний поток в цикле while, и пользовательский интерфейс может быть обновлен через обработчик. Лично я думаю, что Thread и Timer одинаковы, но выглядят по-разному.

Резюме преимуществ

По ощущениям похож на таймер, без особых преимуществ

Применимая сцена

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

1. Используйте метод Handle и thread’s sleep (long)

1) Определить класс обработчика для обработки полученного сообщения.

2) Создайте новый класс потока, который реализует интерфейс Runnable, следующим образом:

3) Добавьте следующую инструкцию, где вы должны начать поток:

Анализ: Реализация собственной чистой Java после сна не гарантирует конкуренцию за ресурсы ЦП, что также вызывает проблему точности, которая должна быть> = 10000 во времени.

2. Использование метода postDelayed обработчика (Runnable, long)

1) Определить класс обработчика

2) Запустить и остановить таймер

Анализ: Ну, это выглядит довольно хорошо, и реализация также проста, и не должно быть никаких блокировок во время сна. Обратите внимание на разницу между ожиданием и интервалом.

3. Способ совмещения Handler с таймером и TimerTask

1) Определить таймер, задание таймера и обработчик

2) Инициализировать задачу таймера

3) Запустить и остановить таймер

Кроме того, Timer также может быть реализован с помощью runOnUiThread следующим образом

Анализ: timer.schedule(task, 2000, 3000); Это означает, что он выполняется в первый раз через 2 секунды, а затем каждые 3000 секунд. Таймер не гарантирует точности и не может разбудить процессор, который не подходит для синхронизации фоновых задач.

Используйте AlarmManger для достижения долгосрочных задач точного времени

Существует три распространенных метода AlarmManager:

  • set (тип int, long startTime, PendingIntent pi); // один раз
  • setExact (тип int, long triggerAtMillis, операция PendingIntent) // Одноразовая точная версия
  • setRepeating(int type,long startTime,long intervalTime,PendingIntent
    pi); // повторить точно
  • setInexactRepeating(int type,long startTime,long
    intervalTime, PendingIntent pi); // Неточно, уменьшить потребление энергии

type указывает тип тревоги, startTime указывает первое время выполнения тревоги, long intervalTime указывает время интервала, а PendingIntent указывает действие ответа тревоги

Подробное объяснение вышеуказанных параметров
Тип будильника:

  • AlarmManager.ELAPSED_REALTIME: остановка после спящего режима, относительное время загрузки
  • AlarmManager.ELAPSED_REALTIME_WAKEUP: ЦП по-прежнему может выходить из спящего режима, чтобы продолжать работать относительно времени загрузки
  • AlarmManager.RTC: то же, что 1, но время относительно абсолютного времени
  • AlarmManager.RTC_WAKEUP: то же, что 2, но время относительно абсолютного времени
  • AlarmManager.POWER_OFF_WAKEUP: все еще доступен после выключения относительно абсолютного времени

Абсолютное время: 1 января 1970 года, 0 часов

startTime:
Первое время срабатывания тревоги в миллисекундах, обычно с использованием текущего времени.

  • SystemClock.elapsedRealtime (): миллисекунды, прошедшие с момента запуска системы
  • System.currentTimeMillis (): 1 января 1970 г. Прошло 0 миллисекунд

intervalTime:Интервал исполнения.

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

Используйте AlarmManger + Service + BarocastReceiver для достижения 5 с после операции печати

Запустите запланированные задачи:

Эффект Демо:

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

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

Метод отмены AlarmManager: AlarmManger.cancel ();

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

В этой статье резюмируется: первый метод не рекомендуется. Краткосрочные запланированные задачи рекомендуется выполнять вторым и третьим способами. Долгосрочные или точные задачи можно выполнять в фоновом режиме с помощью Service.

Любые другие вопросы могут быть подняты ниже или напрямую связаныОфициальный документ AlarmService

окончание

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

Источник

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