【问题标题】:RxJava: How to to execute a task every 5 seconds only if the last task finishedRxJava:仅在最后一个任务完成后如何每 5 秒执行一次任务
【发布时间】:2016-12-10 14:10:30
【问题描述】:

我正在使用 RxJava。我必须每 5 秒执行一次特定任务。使用“Observable.Interval”方法可以完美地工作。 但是,我也有以下限制:如果最后一个任务没有完成,则不能执行新任务。在这种情况下,新任务只需要在最后一个任务完成后执行。

我无法弄清楚如何简单地使用 RxJava 来做到这一点。

所有的想法都将不胜感激^^

感谢阅读。

【问题讨论】:

标签: rx-java reactive-programming rx-android reactivex


【解决方案1】:

当您调用interval 时,会选择一个对应于给定调度程序中的单个线程的工作人员(默认为computation):

Observable
    .interval(5, TimeUnit.SECONDS)
    .flatMap(n -> task());

或者如果任务没有返回任何内容:

Observable
   .interval(5, TimeUnit.SECONDS)
   .doOnNext(n -> task());

这意味着每 5 秒将运行一次,但如果任务需要 5 秒或更长时间,则任务将连续运行(但不会同时运行)。

如果您想确保正在运行的任务之间有间隔,那么您可以根据最后一个任务的完成时间跳过任务。如果你需要的话,我可以把它充实起来。

【讨论】:

  • 非常感谢您的回答。确实,我需要确保正在运行的任务之间的差距。理想情况下,我正在寻找一个纯粹的“reactivex”解决方案来解决这个问题。但是,也许在实践中,根据您的建议添加特定代码以跳过基于时间戳的任务是最简单的方法......
  • 如果我改变间隔,observable 会自动改变还是保持不变?如何让不同的 setter 动态控制间隔?
【解决方案2】:

对 Dave Moten 的回答的小修复:如果需要它实际工作 - 你不应该忘记订阅。你应该这样做

   Observable
    .interval(5, TimeUnit.SECONDS)
    .doOnNext(n -> task())
    .subscribe()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-02
    • 2021-06-14
    • 1970-01-01
    • 1970-01-01
    • 2019-02-22
    • 1970-01-01
    相关资源
    最近更新 更多