【问题标题】:RxJava Observable interval on exact time tick精确时间滴答上的 RxJava 可观察间隔
【发布时间】:2018-02-21 16:19:30
【问题描述】:

我正在尝试在第二个滴答声中使用 RxJava 执行某些操作,标准方法是使用 Observable.interval(1, TimeUnit.SECONDS) 但这只会保证 onNext 每秒被调用一次,而不是准确的第二个打勾。

因此,一种方法可能是在 .interval 中使用“initialDelay”选项,例如 Observable.interval(System.currentTimeMillis() % 1000, 1, TimeUnit.SECONDS) 以精确到秒开始,然后希望所有后续调用都会是正确的,但这有点冒险。

那么有没有办法在 Observable 之外没有我自己的线程的情况下本地执行此操作?

【问题讨论】:

  • 这真的取决于调度器类型和平台。 Scheduler API 指定定期调度补偿花费在响应计时器滴答声上的时间,但仅操作系统调度精度可以让您每滴答声+/- 15 毫秒。为什么需要如此精确地调整执行?
  • 我需要执行,正是因为它触发了 Android 中的时钟等等。 +/- 15 毫秒绝对没问题,但如果你在每个周期添加 15 毫秒,那么在 50 秒后,你将有 500 毫秒的偏差,这不再合适了
  • 您可以使用interval 进行一些实验,以了解它在您的上下文中是如何工作的,例如,通过在每个刻度上打印当前时间,使用timeInterval 并打印随时间变化的差异。
  • 它是一个 Android 应用程序,我无法做到这一点,并确保它可以在每台设备上运行数天而不会出现问题,我需要同步每个滴答声,也许我可以做 Thread.sleep(System.currentTimeMillis( ) % 1000) 在一个循环中,但看起来不是很“rx”

标签: android rx-java2


【解决方案1】:
Observable.timer(delay, interval, TimeUnit.SECONDS)

【讨论】:

  • 是的,这也是我在 OP 中提出的建议,但确实可以保证每次调用都会进行检查,因此长时间执行时可能会出现延迟。你的提案也发出一次,我需要它继续运行。
  • 看起来timer 已被弃用,建议使用interval。我现在将测试它们。你使用什么版本的 RxJava?
  • RxJava2 具有间隔的方法有效,但不保证一小时后由于某种原因会出现时钟偏差
  • 这是一个很长的时间。在这种情况下,您应该使用其他东西,例如警报,因为正是
  • 不确定你是否理解,我希望每秒钟触发一个事件,如果我使用 Observable.interval(System.currentTimeMillis() % 1000, 1, TimeUnit.SECONDS) 它会做技巧但我不确定一小时后是否仍会同步,因此在触发 3600 个事件后,因为它仅在第一次运行时检查增量
猜你喜欢
  • 2018-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多