Как вызвать метод с задержкой в 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 с отображением прогресса в ProgressDialog
Как передать объект из одной активности в другую на Android
Использование контекста в фрагменте
Как проверить доступ к интернету на Android? InetAddress никогда не выдает таймаут
Room - Директория экспорта схемы не указана аннотационному процессору, не удается экспортировать схему