web-dev-qa-db-ja.com

10秒ごとに関数を呼び出すにはどうすればよいですか?

たとえば10秒ごとに関数を呼び出すアプリを作りたいです。

私はこのように私のコードを書きました:

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

    }
}, 10000); 

しかし、このコードをコンパイルした後、関数呼び出しは10秒に1回だけです。

どうすれば修正できますか?

13
user3257386

このようにしてください:

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

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

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

次のようにTimerTimerTaskを組み合わせて使用​​します。

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

また、UIを変更する場合は、必ずrunOnUiThread()を使用してください。

6
FD_

TimerとTimerTaskはあなたが探しているもののようです

Timer timer = new Timer();

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

timer.schedule(timerTask, 0, 10000);
3
Amir Alagic

以下のようにこの依存関係を追加することで、Rx JavaRx 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を特定の値に変更します。

オブザーバブルにサブスクライブし、必要に応じてdisposeをサブスクライブするには、Disposableが必要です(LikeonCleared()onViewModels

private Disposable etaUpdateDisposable;

Consumerを繰り返しロジックがそこに行くようにする必要があります。

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

これで、subscribe(繰り返し機能の開始)とdispose(stop)ができますobservable必要なときはいつでも。

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

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

これを行うには、いくつかの代替方法があります。個人的には、ScheduledExecutorServiceを使用することを好みます。

0
Cheerag

以下のコードを使用してください。

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