как я могу вызывать функцию каждые 10 секунд?

Я хочу создать приложение, которое вызывает функцию, например, каждые 10 секунд.

Я написал свой код так:

Handler ha=new Handler();
ha.postDelayed(new Runnable() {
    @Override
    public void run() {
        //call function

    }
}, 10000); 

Но моя функция вызывается только один раз в 10 секунд после компиляции этого кода.

Как я могу это исправить?


person user3257386    schedule 04.02.2014    source источник
comment
пользовательский таймер и планирование их   -  person Digvesh Patel    schedule 04.02.2014
comment
добавить ha.postDelayed (это, 10000); в конце пробега   -  person yahya    schedule 04.02.2014


Ответы (6)


Делай это так:

final Handler ha=new Handler();
ha.postDelayed(new Runnable() {

    @Override
    public void run() {
        //call function

        ha.postDelayed(this, 10000);
    }
}, 10000);
person Rudi    schedule 04.02.2014
comment
Ваш путь занимает очень много баранов и может быть медленным устройством - person user3257386; 04.02.2014
comment
как мы можем реализовать то же самое с таймером? - person Jaimin Modi; 19.03.2021

Используйте комбинацию Timer и TimerTask следующим образом:

int delay = 0; // delay for 0 sec. 
int period = 10000; // repeat every 10 sec. 
Timer timer = new Timer(); 
timer.scheduleAtFixedRate(new TimerTask() 
{ 
    public void run() 
    { 
        //Call function
    } 
}, delay, period); 

Также не забудьте использовать runOnUiThread(), если хотите изменить пользовательский интерфейс.

person FD_    schedule 04.02.2014
comment
Я делаю это, но мое приложение вызывает функцию один раз, а затем мое приложение зависает и принудительно закрывается. как я могу это исправить? - person user3257386; 04.02.2014
comment
Трудно сказать без вашего LogCat. - person FD_; 04.02.2014
comment
Возможно, вы изменяете пользовательский интерфейс и не используете runOnUiThread(), как упоминалось ранее FD_ - person Salman Khakwani; 05.02.2014

Вы можете использовать Rx java и Rx Android, добавив эту зависимость, как показано ниже:

//Rx Java
implementation 'io.reactivex.rxjava2:rxjava:2.2.13'

//Rx Android
implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'

последнюю версию можно найти здесь.

Вам нужен такой Observable:

private final Observable etaUpdateRepeatableObservable =
        Observable
                .interval(ETA_UPDATE_INTERVALS, TimeUnit.MINUTES)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .repeat();

просто измените ETA_UPDATE_INTERVALS на свое конкретное значение.

Вам понадобится Одноразовый для подписки на наблюдаемый и удалить его при необходимости (например, onCleared () в ViewModels).

private Disposable etaUpdateDisposable;

Вам нужен Потребитель, чтобы ваша повторяющаяся логика пошла туда.

private final Consumer etaUpdateConsumer = o -> {
    //Here you got the repeated logic
};

Теперь вы можете подписаться (начать повторять функцию) и удалить (остановить) наблюдаемое каждый раз, когда вам нужно.

  private void addEtaUpdateDisposable() {
    if (etaUpdateDisposable == null) {
        etaUpdateDisposable = etaUpdateRepeatableObservable.subscribe(etaUpdateConsumer);
    }
}

private void disposeEtaUpdate() {
    if (
            etaUpdateDisposable != null &&
                    !etaUpdateDisposable.isDisposed()
    ) {
        etaUpdateDisposable.dispose();
        etaUpdateDisposable = null;
    }
}
person Sepehr    schedule 14.11.2019

Похоже, что Timer и TimerTask - это то, что вы ищете

Timer timer = new Timer();

TimerTask timerTask = new TimerTask() {       
    @Override
     public void run() {
         //your code
     });
}
    };

timer.schedule(timerTask, 0, 10000);
person Amir Alagic    schedule 04.02.2014
comment
Я делаю это, но мое приложение вызывает функцию один раз, а затем мое приложение зависает и принудительно закрывается. как я могу это исправить? - person user3257386; 04.02.2014
comment
вы должны сообщить нам более подробную информацию. трудно понять, почему ваше приложение зависает без кода ... - person Amir Alagic; 04.02.2014
comment
Я использую задачу таймера, а также обработчик, но задача обработчика и таймера продолжается, поэтому через 10-15 минут все приложение и телефон зависают и зависают, есть ли какое-либо решение для этого? - person Mehul Tank; 30.10.2018
comment
Создайте объект Handler перед TimerTask, а затем используйте этот объект обработчика внутри метода run (). handler.post (новый Runnable () {public void run () {Обновить пользовательский интерфейс}); - person Amir Alagic; 12.12.2018

Используйте приведенный ниже код.

Timer myTimer = new Timer();
            myTimer.schedule(new TimerTask() {
                @Override
                public void run() {
                    //your function
                }
            }, 10000);
person InnocentKiller    schedule 04.02.2014
comment
Я делаю это, но мое приложение вызывает функцию один раз, а затем мое приложение зависает и принудительно закрывается. как я могу это исправить? - person user3257386; 04.02.2014
comment
Создайте объект Handler, а затем используйте его внутри метода run () для обновления пользовательского интерфейса. - person Amir Alagic; 12.12.2018

Есть несколько альтернативных способов сделать это. Лично я предпочитаю использовать ScheduledExecutorService:

person Cheerag    schedule 04.02.2014