how can I call function every 10 sec?

ε祈祈猫儿з 提交于 2019-12-20 18:43:59

问题


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?


回答1:


Do it like this:

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

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

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



回答2:


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.




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



回答4:


Use below code.

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



回答5:


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




回答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;
    }
}


来源:https://stackoverflow.com/questions/21553830/how-can-i-call-function-every-10-sec

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!