18

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?

Sufian
  • 6,405
  • 16
  • 66
  • 120
user3257386
  • 284
  • 1
  • 2
  • 11

6 Answers6

25

Do it like this:

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

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

        ha.postDelayed(this, 10000);
    }
}, 10000);
Sufian
  • 6,405
  • 16
  • 66
  • 120
Rudi
  • 4,304
  • 4
  • 34
  • 44
9

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.

FD_
  • 12,947
  • 4
  • 35
  • 62
6

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;
    }
}
Sepehr
  • 960
  • 11
  • 17
3

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);
Amir Alagic
  • 1,780
  • 1
  • 12
  • 10
  • I do it.but my app call function one time & then my app hang & force close. how can I fix it? – user3257386 Feb 04 '14 at 14:54
  • you have to give us more details. it is hard to know why your app is hanging without code... – Amir Alagic Feb 04 '14 at 15:22
  • i am using timer Task and also handler but handler and timer task continue going so after 10 to 15 minuet whole app and phone is hang and freeze is there any solution for that ? – Mehul Tank Oct 30 '18 at 10:50
  • Create Handler object before TimerTask and then use that handler object inside run() method. handler.post(new Runnable() { public void run(){ Update UI } ); – Amir Alagic Dec 12 '18 at 14:14
0

Use below code.

Timer myTimer = new Timer();
            myTimer.schedule(new TimerTask() {
                @Override
                public void run() {
                    //your function
                }
            }, 10000);
InnocentKiller
  • 5,234
  • 7
  • 36
  • 84
0

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

Cheerag
  • 415
  • 3
  • 10