我如何每10秒调用一次功能?

use*_*386 10 android android-handler

我想制作一个应用程序,例如每隔10秒调用一个函数.

我写了这样的代码:

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

    }
}, 10000); 
Run Code Online (Sandbox Code Playgroud)

但是编译完这段代码后,我的函数在10秒内调用了一次.

我该如何解决?

Rud*_*udi 21

像这样做:

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

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

        ha.postDelayed(this, 10000);
    }
}, 10000);
Run Code Online (Sandbox Code Playgroud)


FD_*_*FD_ 6

使用的组合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); 
Run Code Online (Sandbox Code Playgroud)

runOnUiThread()如果要修改UI,请务必使用.


Sep*_*ehr 6

您可以通过添加此依赖项来使用Rx javaRx Android,如下所示:

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

//Rx Android
implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
Run Code Online (Sandbox Code Playgroud)

在这里结帐以获得最新版本。

你需要一个像这样的 Observable :

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

只需更改ETA_UPDATE_INTERVALS为您的特定值即可。

您需要一个Disposable来订阅 observable 并在需要时处置它(如ViewModels上的onCleared()

private Disposable etaUpdateDisposable;
Run Code Online (Sandbox Code Playgroud)

你需要一个消费者,你的重复逻辑会去那里。

private final Consumer etaUpdateConsumer = o -> {
    //Here you got the repeated logic
};
Run Code Online (Sandbox Code Playgroud)

现在,您可以在每次需要时订阅(开始重复功能)和处置(停止) 可观察对象。

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

private void disposeEtaUpdate() {
    if (
            etaUpdateDisposable != null &&
                    !etaUpdateDisposable.isDisposed()
    ) {
        etaUpdateDisposable.dispose();
        etaUpdateDisposable = null;
    }
}
Run Code Online (Sandbox Code Playgroud)