Я хочу иметь возможность вызывать следующий метод после указанной задержки. В цели c было что-то вроде:
[self performSelector:@selector(DoSomething) withObject:nil afterDelay:5];
Есть ли эквивалент этого метода в Android с Java? Например, мне нужно иметь возможность вызывать метод через 5 секунд.
public void DoSomething()
{
//do something here
}
removeCallbacks(Runnable r)
наHandler
.import android.os.handler
Я не мог использовать другие ответы в моем случае. Я использовал нативный таймер Java вместо этого.
источник
Примечание. Этот ответ был дан, когда в вопросе не был указан Android в качестве контекста. Ответ на вопрос, касающийся темы пользовательского интерфейса Android, можно найти здесь.
Похоже, что API Mac OS позволяет текущему потоку продолжить и планирует выполнение задачи асинхронно. В Java эквивалентная функция предоставляется
java.util.concurrent
пакетом. Я не уверен, какие ограничения может наложить Android.источник
ScheduledFuture<?>
возвращаемый объектworker.schedule()
и вызовите егоcancel(boolean)
метод.ScheduledExecutorService
.Для выполнения чего-либо в потоке пользовательского интерфейса через 5 секунд:
источник
Вы можете использовать Handler внутри UIThread:
источник
Спасибо за все отличные ответы, я нашел решение, которое наилучшим образом соответствует моим потребностям.
источник
1. Использование
Handler
2. Использование TimerTask
Или даже короче
Или самый короткий будет
3. Использование
Executors
1. Использование
Handler
2. Использование
Timer
3. Использование
ScheduledExecutorService
источник
How to call a method after a delay in Android
. Поэтому я сосредоточился на этом. К точке. В противном случае утечка Java - большая тема для отдельного понимания разработчиками.Смотрите это демо:
источник
Если вам нужно использовать обработчик, но вы находитесь в другом потоке, вы можете использовать его
runonuithread
для запуска обработчика в потоке пользовательского интерфейса. Это избавит вас от исключений, брошенных с просьбой позвонитьLooper.Prepare()
Выглядит довольно грязно, но это один из способов.
источник
Я предпочитаю использовать
View.postDelayed()
метод, простой код ниже:источник
Вот мое самое короткое решение:
источник
источник
Если вы используете Android Studio 3.0 и выше, вы можете использовать лямбда-выражения. Метод
callMyMethod()
вызывается через 2 секунды:Если вам нужно отменить отложенный запуск, используйте это:
источник
Я предлагаю Таймер , он позволяет запланировать вызов метода на очень определенный интервал. Это не заблокирует ваш пользовательский интерфейс и не оставит ваше приложение отзывчивым во время выполнения метода.
Другой вариант - это wait (); метод, это заблокирует текущий поток на указанный промежуток времени. Это заставит ваш пользовательский интерфейс перестать отвечать, если вы сделаете это в потоке пользовательского интерфейса.
источник
Для простой строки Handle Post delay вы можете сделать следующее:
надеюсь, это поможет
источник
Вы можете использовать это для простейшего решения:
Еще, ниже может быть еще одно чистое полезное решение:
источник
Вы можете сделать это намного чище, используя недавно введенные лямбда-выражения:
источник
Так что здесь есть несколько вещей, которые нужно учитывать, так как есть много способов снять шкуру с этой кошки. Хотя ответы уже все были выбраны и выбраны. Я думаю, что важно, чтобы это было пересмотрено с надлежащими руководящими принципами кодирования, чтобы никто не шел в неправильном направлении только из-за «простого ответа большинства».
Итак, сначала давайте обсудим простой ответ с задержкой после публикации, который является ответом, выбранным победителем в целом в этой теме.
Несколько вещей для рассмотрения. После задержки вы можете столкнуться с утечками памяти, мертвыми объектами, ушедшими жизненными циклами и многим другим. Поэтому правильное обращение с ним также важно. Вы можете сделать это несколькими способами.
Ради современного развития я поставлю в КОТЛИН
Вот простой пример использования потока пользовательского интерфейса при обратном вызове и подтверждение того, что ваша активность все еще жива, когда вы нажимаете на обратный вызов.
Тем не менее, это все еще не идеально, поскольку нет никаких причин, чтобы ответить на ваш обратный вызов, если активность ушла. так что лучшим способом было бы сохранить ссылку на него и удалить его обратные вызовы, как это.
и, конечно же, очистка onPause, чтобы он не попадал в обратный вызов.
Теперь, когда мы обсудили очевидное, давайте поговорим о более чистом варианте с современными сопрограммами и котлином :). Если вы еще не используете их, вы действительно пропустите.
или если вы хотите всегда запускать пользовательский интерфейс для этого метода, вы можете просто сделать:
Конечно, точно так же, как PostDelayed, вы должны убедиться, что обрабатываете отмену, чтобы вы могли либо выполнять проверки активности после задержки вызова, либо вы можете отменить ее в onPause, как и другой маршрут.
// обрабатывать очистку
Если вы поместите запуск (UI) в сигнатуру метода, задание может быть назначено в вызывающей строке кода.
Таким образом, мораль этой истории заключается в том, чтобы быть в безопасности с вашими отложенными действиями, убедитесь, что вы удалили свои обратные вызовы, или отменили свою работу, и, конечно, подтвердите, что у вас есть правильный жизненный цикл, чтобы коснуться элементов в вашем обратном обратном вызове. Coroutines также предлагает отменяемые действия.
Также стоит отметить, что вы обычно должны обрабатывать различные исключения, которые могут возникнуть с сопрограммами. Например, отмена, исключение, тайм-аут, все, что вы решите использовать. Вот более сложный пример, если вы решите действительно использовать сопрограммы.
источник
Я создал более простой метод для вызова этого.
Чтобы использовать это, просто позвоните:
.CallWithDelay(5000, this, "DoSomething");
источник
performSelector
. это лучший способ сделать.Ниже один работает, когда вы получаете,
источник
Используя Kotlin, мы можем сделать следующее
источник
Это очень легко с помощью
CountDownTimer
. Для получения более подробной информации https://developer.android.com/reference/android/os/CountDownTimer.htmlисточник
Если вы используете RxAndroid, то обработка потоков и ошибок станет намного проще. Следующий код выполняется с задержкой
источник
Кажется, что все забывают очистить обработчик, прежде чем публиковать на нем новый исполняемый файл или сообщение. В противном случае они могут потенциально накапливаться и вызывать плохое поведение.
источник
Вот еще один хитрый способ: он не будет генерировать исключение при изменении элементов интерфейса.
Вы можете вызвать анимацию так:
Анимацию можно прикрепить к любому виду.
источник
Вот ответ в Kotlin вы ленивые, ленивые люди:
источник
Я люблю вещи чище: вот моя реализация, встроенный код для использования внутри вашего метода
источник
Подходящее решение в Android:
источник
Аналогичное решение, но гораздо более чистое в использовании
Напишите эту функцию вне класса
Применение:
источник
do
это встроенный метод, поэтому мы должны использовать `, чтобы использовать его в качестве имени переменнойdo
после задержки 3 секундыВ Android ниже можно написать код kotlin для задержки выполнения любой функции.
источник