Question

I want make an app that call a function for example every 10 sec.

I wrote my code like this:

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

    }
}, 10000); 

But my function call just one time in 10 sec after compile this code.

How can I fix it?

Était-ce utile?

La solution

Do it like this:

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

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

        ha.postDelayed(this, 10000);
    }
}, 10000);

Autres conseils

Use a combination of Timer and TimerTask like this:

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); 

Also make sure to use runOnUiThread() if you want to modify the UI.

You can use Rx java & Rx Android by adding this dependency as below :

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

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

checkout Here for the latest version.

You need an Observable like this :

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

just change ETA_UPDATE_INTERVALS to your specific value.

You need a Disposable for subscribing to observable and to dispose it when required (Like onCleared() on ViewModels)

private Disposable etaUpdateDisposable;

You need a Consumer that your repeated logic would go there.

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

Now you can subscribe(Start repeating function) and dispose(stop) observable every time you need.

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

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

It looks that Timer and TimerTask are what are you looking for

Timer timer = new Timer();

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

timer.schedule(timerTask, 0, 10000);

Use below code.

Timer myTimer = new Timer();
            myTimer.schedule(new TimerTask() {
                @Override
                public void run() {
                    //your function
                }
            }, 10000);

There are number of alternative ways to do this. Personally, I prefer to use ScheduledExecutorService:

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top