У меня есть переменная в моем коде сказать, что это «статус».
Я хочу отобразить некоторый текст в приложении в зависимости от значения этой переменной. Это должно быть сделано с определенной задержкой.
Это как,
Проверьте значение переменной состояния
Показать текст
Подождите 10 секунд
Проверьте значение переменной состояния
Показать текст
Подождите 15 секунд
и так далее. Время задержки может варьироваться, и оно устанавливается после отображения текста.
Я пытался, Thread.sleep(time delay)
и это не удалось. Есть ли лучший способ сделать это?
android
android-thread
Кальпа Патум Веливитигода
источник
источник
Ответы:
Вы должны использовать
Handler
«SpostDelayed
функцию для этой цели. Он будет запускать ваш код с указанной задержкой в основном потоке пользовательского интерфейса, поэтому вы сможете обновить элементы управления пользовательского интерфейса.источник
Для всех, кто интересуется, вот класс, который я создал, используя код inazaruk, который создает все необходимое (я назвал его UIUpdater, потому что я использую его для периодического обновления пользовательского интерфейса, но вы можете называть его как угодно):
Затем вы можете создать объект UIUpdater внутри вашего класса и использовать его следующим образом:
Если вы хотите использовать это как средство обновления активности, поместите начальный вызов в метод onResume () и остановочный вызов в onPause (), чтобы обновления запускались и останавливались в соответствии с видимостью активности.
источник
UPDATE_INTERVAL = interval;
должно быть доthis(uiUpdater);
того, вUIUpdater(Runnable uiUpdater, int interval)
(как значениеUPDATE_INTERVAL
используется , и должен быть один передается в качестве параметраinterval;
). Также избегайте ширины более 80 символов в коде, когда это возможно (почти всегда;)new Handler(Looper.getMainLooper())
. Во-вторых, он не проверяет аргументы, поэтому глотает пустые Runnables и отрицательные интервалы. Наконец, он не учитывает время, проведенное вuiUpdater.run()
строке, и не обрабатывает возможные исключения, создаваемые этим методом. Также это не потокобезопасно, вы должны сделатьstart
иstop
синхронизировать методы.error: call to this must be first statement in constructor
может быть, есть простое решение.Я думаю, что новая горячность заключается в использовании ScheduledThreadPoolExecutor . Вот так:
источник
Executors.newSingleThreadScheduledExecutor()
может быть другой вариант здесь.Таймер работает отлично. Здесь я использую таймер для поиска текста через 1,5 с и обновления пользовательского интерфейса. Надеюсь, это поможет.
источник
Есть 3 способа сделать это:
Использовать ScheduledThreadPoolExecutor
Немного излишества, так как вам не нужен пул Thread
Использовать задачу таймера
Старый стиль Android
Используйте Handler и Runnable
Современный стиль Android
Негерметичный обработчик с действием / контекстом
Объявите внутренний класс Handler, который не пропускает память в вашем классе Activity / Fragment
Объявите исполняемый файл, который будет выполнять ваши повторяющиеся задачи в классе Activity / Fragment.
Инициализируйте объект-обработчик в вашем Activity / Fragment (здесь FlashActivity - мой класс активности)
Повторить задачу после фиксированного интервала времени
Чтобы остановить повторение задачи
ОБНОВЛЕНИЕ: в Котлине:
источник
Таймер - это еще один способ сделать вашу работу, но не забудьте добавить его,
runOnUiThread
если вы работаете с пользовательским интерфейсом.и XML это ...
Запланируйте обратный отсчет до определенного времени в будущем с регулярными уведомлениями об интервалах по пути. Пример отображения 30-секундного обратного отсчета в текстовом поле:
Для деталей
источник
Попробуйте следующий пример, это работает !!!
Используйте [Handler] в методе onCreate (), который использует метод postDelayed (), который заставляет Runnable быть добавленным в очередь сообщений, чтобы запускаться по истечении указанного промежутка времени, равного 0 в данном примере. 1
Ссылайтесь на этот код:
источник
Вы можете использовать обработчик для публикации исполняемого кода. Этот метод очень хорошо описан здесь: https://guides.codepath.com/android/Repeating-Periodic-Tasks
источник
Основываясь на вышеупомянутом посте относительно ScheduledThreadPoolExecutor , я придумал утилиту, которая отвечала моим потребностям (хотел запускать метод каждые 3 секунды):
источник
В моем случае я должен был выполнить процесс, если выполнялось одно из этих условий: был ли завершен предыдущий процесс или уже прошло 5 секунд. Итак, я сделал следующее и работал довольно хорошо:
Если process1 читается, он выполняет process2. Если нет, он увеличивает переменную times и заставляет обработчик выполняться через одну секунду. Он поддерживает цикл до тех пор, пока не будет прочитано process1 или пока не будет 5. Когда times равно 5, это означает, что прошло 5 секунд, и в каждую секунду выполняется условие if из process1.isRead ().
источник
Использовать kotlin и его сопрограмму довольно просто, сначала объявите работу в вашем классе (лучше в viewModel) следующим образом:
затем, когда вы хотите создать и запустить его, сделайте это:
и если вы хотите закончить это:
PS:
viewModelScope
доступно только в моделях просмотра, вы можете использовать другие области Coroutine, такие какwithContext(Dispatchers.IO)
Больше информации: здесь
источник
Для людей, использующих Kotlin, ответ Иназарука не будет работать, IDE потребует инициализации переменной, поэтому вместо использования
postDelayed
внутриRunnable
мы будем использовать ее в отдельном методе.Инициализируйте ваш
Runnable
так:Инициализируйте ваш
runDelayedHandler
метод следующим образом:Как вы можете видеть, этот подход позволит вам контролировать время выполнения задачи, отслеживать
keepRunning
и изменять ее в течение срока службы приложения.источник