Да, Handler
отправляет сообщения на Thread
, на котором вы его создаете - это означает, что вы создали свой обработчик в другом потоке, где циклический элемент не настроен по умолчанию (тогда как в основном потоке циклический элемент устанавливается по умолчанию - вот почему обработчики работают сразу при создании в главном потоке).
Вы можете использовать стандартную Java Timer
для планирования действий на будущее, этот таймер использует свой собственный поток для выполнения ваших действий, например:
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
// your action
}
}, your delay);
Другим решением будет использование RxJava, однако, если вы не знакомы с ним, потребуется некоторое время для изучения. Пример кода, который запускает ваше действие в другом потоке, возвращает результат в основном потоке и задерживается на 250 миллисекунд:
(Kotlin here) Completable.fromAction(object : Action {
override fun run() {
// your action
}
}).subscribeOn(Schedulers.newThread())
.subscribeOn(AndroidSchedulers.mainThread())
.delay(250, TimeUnit.MILLISECONDS)
.subscribe()
AsyncTask
обычно устаревают, чтобы выполнять любые потоки