Как вызвать метод с задержкой в Android
Я хочу иметь возможность вызывать следующий метод с заданной задержкой. В Objective-C существовал аналогичный способ:
[self performSelector:@selector(DoSomething) withObject:nil afterDelay:5];
Есть ли эквивалент этого метода в Android с использованием Java? Например, мне нужно вызвать метод через 5 секунд.
public void DoSomething() {
// что-то сделать здесь
}
5 ответ(ов)
Kotlin
Handler(Looper.getMainLooper()).postDelayed({
// Выполнить что-то через 100мс
}, 100)
Java
final Handler handler = new Handler(Looper.getMainLooper());
handler.postDelayed(new Runnable() {
@Override
public void run() {
// Выполнить что-то через 100мс
}
}, 100);
Импортируемый класс - android.os.Handler
.
Это пример использования Handler
для выполнения кода с задержкой в 100 миллисекунд на основном потоке. В Kotlin мы используем лямбда-выражение, а в Java - анонимный класс.
Я не смог использовать ни один из других ответов в моем случае. Вместо этого я использовал встроенный таймер Java.
new Timer().schedule(new TimerTask() {
@Override
public void run() {
// этот код будет выполнен через 2 секунды
}
}, 2000);
Для выполнения каких-либо действий в основном потоке (UI потоке) через 5 секунд, вы можете использовать следующий код:
new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
@Override
public void run() {
// Выполните здесь необходимые действия
}
}, 5000);
Этот код создает новый объект Handler
, связанный с основным потоком, и использует метод postDelayed
для выполнения заданной задачи через 5000 миллисекунд (или 5 секунд). Внутри метода run()
вы можете разместить необходимую логику, которую хотите выполнить по истечении указанного времени.
Kotlin и Java: несколько способов задержки выполнения
1. Использование Handler
Handler().postDelayed({
TODO("Сделайте что-то")
}, 2000)
2. Использование TimerTask
Timer().schedule(object : TimerTask() {
override fun run() {
TODO("Сделайте что-то")
}
}, 2000)
Или еще короче:
Timer().schedule(timerTask {
TODO("Сделайте что-то")
}, 2000)
Самый короткий вариант:
Timer().schedule(2000) {
TODO("Сделайте что-то")
}
3. Использование Executors
Executors.newSingleThreadScheduledExecutor().schedule({
TODO("Сделайте что-то")
}, 2, TimeUnit.SECONDS)
На Java
1. Использование Handler
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
// Сделайте что-то
}
}, 2000);
2. Использование Timer
new Timer().schedule(new TimerTask() {
@Override
public void run() {
// Сделайте что-то
}
}, 2000);
3. Использование ScheduledExecutorService
private static final ScheduledExecutorService worker = Executors.newSingleThreadScheduledExecutor();
Runnable runnable = new Runnable() {
public void run() {
// Сделайте что-то
}
};
worker.schedule(runnable, 2, TimeUnit.SECONDS);
Вы можете использовать Handler
внутри основного (UI) потока:
runOnUiThread(new Runnable() {
@Override
public void run() {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
// добавьте ваш код здесь
}
}, 1000);
}
});
В данном примере runOnUiThread
гарантирует, что указанный код будет выполнен в основном потоке приложения. Handler
создается внутри этого потока и используется для отложенного выполнения кода через 1000 миллисекунд (1 секунду).
Как исправить 'android.os.NetworkOnMainThreadException'?
Ошибка «Необходимо переопределить метод суперкласса» после импорта проекта в Eclipse
Почему в RecyclerView отсутствует onItemClickListener()?
Не удается запустить Eclipse - Java был запущен, но вернул код завершения = 13
Как передать объект из одной активности в другую на Android