- Delayed task execution in Java and Android
- EnvyAndroid
- EnvyAndroid
- More in Android Development
- Butterknife — A viewbinding tool for Android
- Useful ADB Commands
- How to fix ArrayIndexOutOfBoundsException in your custom ListAdapter
- How to detect changes to your Android Preferences
- Android SQLite Sort order does not work with upper and lowercase letters
- Repeating Periodic Tasks
- Как вызвать метод после задержки в Android
- Котлин
- Kotlin И Java много способов
- 1. Использование Handler
- 2. Использование TimerTask
- 3. Использование Executors
- На яве
- 1. Использование Handler
- 2. Использование Timer
- 3. Использование ScheduledExecutorService
- Русские Блоги
- Несколько способов реализовать таймеры в Android
- предисловие
- Механизм сообщений Android
- текст
- AlarmManager
- Резюме преимуществ
- Применимая сцена
- Handler
- Резюме преимуществ
- Применимая сцена
- Timer
- Резюме преимуществ
- Применимая сцена
- Thread
- Резюме преимуществ
- Применимая сцена
- 1. Используйте метод Handle и thread’s sleep (long)
- 2. Использование метода postDelayed обработчика (Runnable, long)
- 3. Способ совмещения Handler с таймером и TimerTask
- Используйте AlarmManger для достижения долгосрочных задач точного времени
- окончание
Delayed task execution in Java and Android
EnvyAndroid
Read more posts by this author.
EnvyAndroid
If you need to do some delayed task in for example your Android App, you can easily achieve this with a Java TimerTask.
This is a short example, where some method ( removeDialog() ) is run with a delay of 2 seconds.
More in Android Development
Butterknife — A viewbinding tool for Android
24 May 2015 – 2 min read
Useful ADB Commands
16 May 2015 – 1 min read
How to fix ArrayIndexOutOfBoundsException in your custom ListAdapter
9 Jun 2014 – 1 min read
How to detect changes to your Android Preferences
This will demonstrate how to listen for changes to the user preferences in your app, so that you can perform tasks depending on what the user selected/changed on the preferences screen. I have an app, with a listfragment displaying rows of text. There
Android SQLite Sort order does not work with upper and lowercase letters
If you are using SQLite database, with a Cursor or Perhaps Content provider, you may have come across alphabetical sorting problems regarding upper and lowercase letters. Perhaps you are requesting a cursor from a Content Provider: String[] projection =
Источник
Repeating Periodic Tasks
Repeating periodic tasks within an application is a common requirement. This functionality can be used for polling new data from the network, running manual animations, or simply updating the UI. There are at least four ways to run periodic tasks:
- Handler — Execute a Runnable task on the UIThread after an optional delay
- ScheduledThreadPoolExecutor — Execute periodic tasks with a background thread pool
- AlarmManager — Execute any periodic task in the background as a service
- TimerTask — Doesn’t run in UIThread and is not reliable. Consensus is to never use TimerTask
Recommended methods are outlined below.
We can use a Handler to run code on a given thread after a delay or repeat tasks periodically on a thread. This is done by constructing a Handler and then «posting» Runnable code to the event message queue on the thread to be processed.
Using a Handler , we can execute arbitrary code a single time after a specified delay:
Using a similar technique, we can also use a handler to execute a periodic runnable task as demonstrated below:
We can remove the scheduled execution of a runnable with:
Note that with a Handler , the Runnable executes in UIThread by default so you can safely update the user interface within the runnable code block. See this handler post and this other handler post for reference.
Refer to our threads and handlers guide for a more advanced breakdown.
A pool of threads which can schedule commands to execute periodically in the background. Useful when multiple worker threads are needed but generally not needed. See this guide on how they work or this stackoverflow post.
This should be used if the periodic tasks need to run in the background even when the app is not in the foreground. This leverages the alarm service on the phone to cause periodic executions of a service which will run continuously until stopped. See the AlarmManager section of the services guide for details.
Источник
Как вызвать метод после задержки в Android
Я хочу иметь возможность вызывать следующий метод после указанной задержки. В цели c было что-то вроде:
Есть ли эквивалент этого метода в Android с Java? Например, мне нужно иметь возможность вызывать метод через 5 секунд.
Котлин
Я не мог использовать другие ответы в моем случае. Я использовал нативный таймер Java вместо этого.
Примечание. Этот ответ был дан, когда в вопросе не был указан Android в качестве контекста. Ответ на вопрос, касающийся темы пользовательского интерфейса Android, можно найти здесь.
Похоже, что API Mac OS позволяет текущему потоку продолжить и планирует выполнение задачи асинхронно. В Java эквивалентная функция предоставляется java.util.concurrent пакетом. Я не уверен, какие ограничения может наложить Android.
Для выполнения чего-либо в потоке пользовательского интерфейса через 5 секунд:
Вы можете использовать Handler внутри UIThread:
Спасибо за все отличные ответы, я нашел решение, которое наилучшим образом соответствует моим потребностям.
Kotlin И Java много способов
1. Использование Handler
2. Использование TimerTask
Или даже короче
Или самый короткий будет
3. Использование Executors
На яве
1. Использование Handler
2. Использование Timer
3. Использование ScheduledExecutorService
Смотрите это демо:
Если вам нужно использовать обработчик, но вы находитесь в другом потоке, вы можете использовать его runonuithread для запуска обработчика в потоке пользовательского интерфейса. Это избавит вас от исключений, брошенных с просьбой позвонить Looper.Prepare()
Выглядит довольно грязно, но это один из способов.
Я предпочитаю использовать View.postDelayed() метод, простой код ниже:
Вот мое самое короткое решение:
Если вы используете Android Studio 3.0 и выше, вы можете использовать лямбда-выражения. Метод callMyMethod() вызывается через 2 секунды:
Если вам нужно отменить отложенный запуск, используйте это:
Я предлагаю Таймер , он позволяет запланировать вызов метода на очень определенный интервал. Это не заблокирует ваш пользовательский интерфейс и не оставит ваше приложение отзывчивым во время выполнения метода.
Другой вариант — это wait (); метод, это заблокирует текущий поток на указанный промежуток времени. Это заставит ваш пользовательский интерфейс перестать отвечать, если вы сделаете это в потоке пользовательского интерфейса.
Для простой строки Handle Post delay вы можете сделать следующее:
надеюсь, это поможет
Вы можете использовать это для простейшего решения:
Еще, ниже может быть еще одно чистое полезное решение:
Вы можете сделать это намного чище, используя недавно введенные лямбда-выражения:
Так что здесь есть несколько вещей, которые нужно учитывать, так как есть много способов снять шкуру с этой кошки. Хотя ответы уже все были выбраны и выбраны. Я думаю, что важно, чтобы это было пересмотрено с надлежащими руководящими принципами кодирования, чтобы никто не шел в неправильном направлении только из-за «простого ответа большинства».
Итак, сначала давайте обсудим простой ответ с задержкой после публикации, который является ответом, выбранным победителем в целом в этой теме.
Несколько вещей для рассмотрения. После задержки вы можете столкнуться с утечками памяти, мертвыми объектами, ушедшими жизненными циклами и многим другим. Поэтому правильное обращение с ним также важно. Вы можете сделать это несколькими способами.
Ради современного развития я поставлю в КОТЛИН
Вот простой пример использования потока пользовательского интерфейса при обратном вызове и подтверждение того, что ваша активность все еще жива, когда вы нажимаете на обратный вызов.
Тем не менее, это все еще не идеально, поскольку нет никаких причин, чтобы ответить на ваш обратный вызов, если активность ушла. так что лучшим способом было бы сохранить ссылку на него и удалить его обратные вызовы, как это.
и, конечно же, очистка onPause, чтобы он не попадал в обратный вызов.
Теперь, когда мы обсудили очевидное, давайте поговорим о более чистом варианте с современными сопрограммами и котлином :). Если вы еще не используете их, вы действительно пропустите.
или если вы хотите всегда запускать пользовательский интерфейс для этого метода, вы можете просто сделать:
Конечно, точно так же, как PostDelayed, вы должны убедиться, что обрабатываете отмену, чтобы вы могли либо выполнять проверки активности после задержки вызова, либо вы можете отменить ее в onPause, как и другой маршрут.
Если вы поместите запуск (UI) в сигнатуру метода, задание может быть назначено в вызывающей строке кода.
Таким образом, мораль этой истории заключается в том, чтобы быть в безопасности с вашими отложенными действиями, убедитесь, что вы удалили свои обратные вызовы, или отменили свою работу, и, конечно, подтвердите, что у вас есть правильный жизненный цикл, чтобы коснуться элементов в вашем обратном обратном вызове. Coroutines также предлагает отменяемые действия.
Также стоит отметить, что вы обычно должны обрабатывать различные исключения, которые могут возникнуть с сопрограммами. Например, отмена, исключение, тайм-аут, все, что вы решите использовать. Вот более сложный пример, если вы решите действительно использовать сопрограммы.
Источник
Русские Блоги
Несколько способов реализовать таймеры в Android
предисловие
В эти дни я просматриваю официальную документацию по разработке под Android, и есть много предложений по разработке, о которых стоит подумать, и друзья, у которых есть время, могут это проверить. Очень удобно).
Один из курсов упоминал AlarmManager. Этот класс был просто для того, чтобы понять, что это менеджер будильника. Если вы хотите сделать какое-то программное обеспечение, которое лучше, чем напоминания и будильники, вам нужно его использовать. Официальный пример используется для реализации таймера. Я внезапно почувствовал, что это очень волшебная вещь. Я собрал некоторую информацию и записал несколько известных мне способов реализации таймера, чтобы углубить свою память и поделиться ею со всеми.
Механизм сообщений Android
Давайте сначала разберемся с механизмом обработки сообщений Android
То есть механизм работы Handlerd. Для работы обработчика требуется поддержка базовых MessageQueue и Looper. MessageQueue (очередь сообщений), которая хранит некоторые сообщения внутри и обеспечивает внешние операции вставки и удаления в виде очереди (фактически хранилище единого списка). Looper (цикл сообщений), взаимодействуйте с MessageQueue для достижения непрерывного постановки в очередь и удаления из очереди сообщений.
Обработчики могут легко переключать задачи в другие потоки для выполнения, чтобы уменьшить нагрузку на основной поток, поэтому обработчики часто используются для обновлений пользовательского интерфейса. Вот только краткий обзор. Соответствующим блоггерам пока настоятельно не рекомендуется ссылаться на следующие блоги:
Android-механизм асинхронной обработки сообщений
Android AsyncTask полностью решен
Конечно, теперь есть лучшие способы обработки сообщений. Понимание обработчиков и 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
окончание
Выше приведены несколько методов реализации таймеров, которые я лично использовал, но они являются лишь краткими введениями. В Интернете есть много связанных материалов для более подробного использования. Если есть ошибки, пожалуйста, оставьте комментарий и комментарий. Я надеюсь закончить чтение этого. Эта статья может помочь вам.
Источник