【问题标题】:how can I call function every 10 sec?如何每 10 秒调用一次函数?
【发布时间】:2023-03-16 10:04:01
【问题描述】:

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

我的代码是这样写的:

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

    }
}, 10000); 

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

我该如何解决?

【问题讨论】:

  • 用户定时器和时间安排
  • 添加 ha.postDelayed(this, 10000);在运行结束时

标签: android android-handler


【解决方案1】:

这样做:

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

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

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

【讨论】:

  • 你的方式需要非常多的内存并且可能是慢速设备
  • 我们如何使用 Timer 实现相同的功能?
【解决方案2】:

像这样使用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()

【讨论】:

  • 我这样做了。但是我的应用程序调用功能一次,然后我的应用程序挂起并强制关闭。我该如何解决?
  • 没有你的 LogCat 很难分辨。
  • 您可能正在修改 UI 而没有使用 FD_ 前面提到的 runOnUiThread()
【解决方案3】:

您可以通过添加以下依赖项来使用 Rx javaRx 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 更改为您的具体值。

你需要一个 Disposable 来订阅 observable 并在需要时dispose它(例如 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;
    }
}

【讨论】:

    【解决方案4】:

    看来你要找的是 Timer 和 TimerTask

    Timer timer = new Timer();
    
    TimerTask timerTask = new TimerTask() {       
        @Override
         public void run() {
             //your code
         });
    }
        };
    
    timer.schedule(timerTask, 0, 10000);
    

    【讨论】:

    • 我这样做了。但是我的应用程序调用功能一次,然后我的应用程序挂起并强制关闭。我该如何解决?
    • 您必须向我们提供更多详细信息。很难知道为什么您的应用程序在没有代码的情况下挂起......
    • 我正在使用定时器任务和处理程序,但处理程序和定时器任务继续进行,所以在 10 到 15 分钟后,整个应用程序和手机挂起并冻结,有什么解决方案吗?
    • 在 TimerTask 之前创建处理程序对象,然后在 run() 方法中使用该处理程序对象。 handler.post(new Runnable() { public void run(){ 更新 UI } );
    【解决方案5】:

    使用下面的代码。

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

    【讨论】:

    • 我这样做了。但是我的应用程序调用功能一次,然后我的应用程序挂起并强制关闭。我该如何解决?
    • 创建 Handler 对象,然后在 run() 方法中使用它来更新 UI。
    【解决方案6】:

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

    【讨论】:

      猜你喜欢
      • 2018-02-16
      • 2017-11-22
      • 1970-01-01
      • 2011-08-06
      • 1970-01-01
      • 2011-11-06
      • 2011-03-09
      相关资源
      最近更新 更多