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

时间:2014-02-04 13:27:57

标签: android android-handler

我想创建一个应用程序,例如每10秒调用一个函数。

我写了这样的代码:

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

    }
}, 10000); 

但编译此代码后,我的函数在10秒内只调用一次。

我该如何解决?

6 个答案:

答案 0 :(得分:19)

这样做:

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

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

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

答案 1 :(得分: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); 

如果要修改用户界面,请务必使用runOnUiThread()

答案 2 :(得分:1)

看起来Timer和TimerTask正是你在寻找什么

Timer timer = new Timer();

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

timer.schedule(timerTask, 0, 10000);

答案 3 :(得分:0)

使用以下代码。

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

答案 4 :(得分:0)

有很多替代方法可以做到这一点。就个人而言,我更喜欢使用ScheduledExecutorService:

答案 5 :(得分:0)

您可以通过添加以下依赖项来使用 Rx Java Rx Android

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

//Rx Android
implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'

检出Here以获取最新版本。

您需要这样的Observable:

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

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

您需要一次性来订阅可观察的内容,并在需要时进行处置(如 ViewModels上的 onCleared()

private Disposable etaUpdateDisposable;

您需要一个消费者,以便您的重复逻辑可以在那里。

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

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

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

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