たとえば10秒ごとに関数を呼び出すアプリを作りたいです。
私はこのように私のコードを書きました:
Handler ha=new Handler();
ha.postDelayed(new Runnable() {
@Override
public void run() {
//call function
}
}, 10000);
しかし、このコードをコンパイルした後、関数呼び出しは10秒に1回だけです。
どうすれば修正できますか?
このようにしてください:
final Handler ha=new Handler();
ha.postDelayed(new Runnable() {
@Override
public void run() {
//call function
ha.postDelayed(this, 10000);
}
}, 10000);
次のように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);
_
また、UIを変更する場合は、必ずrunOnUiThread()
を使用してください。
TimerとTimerTaskはあなたが探しているもののようです
Timer timer = new Timer();
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
//your code
});
}
};
timer.schedule(timerTask, 0, 10000);
以下のようにこの依存関係を追加することで、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
を特定の値に変更します。
オブザーバブルにサブスクライブし、必要に応じて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;
}
}
これを行うには、いくつかの代替方法があります。個人的には、ScheduledExecutorServiceを使用することを好みます。
以下のコードを使用してください。
Timer myTimer = new Timer();
myTimer.schedule(new TimerTask() {
@Override
public void run() {
//your function
}
}, 10000);