我想创建一个应用程序,例如每10秒调用一个函数。
我写了这样的代码:
Handler ha=new Handler();
ha.postDelayed(new Runnable() {
@Override
public void run() {
//call function
}
}, 10000);
但编译此代码后,我的函数在10秒内只调用一次。
我该如何解决?
答案 0 :(得分:19)
这样做:
final Handler ha=new Handler();
ha.postDelayed(new Runnable() {
@Override
public void run() {
//call function
ha.postDelayed(this, 10000);
}
}, 10000);
答案 1 :(得分:6)
使用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);
如果要修改用户界面,请务必使用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;
}
}