【发布时间】:2018-02-21 16:19:30
【问题描述】:
我正在尝试在第二个滴答声中使用 RxJava 执行某些操作,标准方法是使用 Observable.interval(1, TimeUnit.SECONDS) 但这只会保证 onNext 每秒被调用一次,而不是准确的第二个打勾。
因此,一种方法可能是在 .interval 中使用“initialDelay”选项,例如 Observable.interval(System.currentTimeMillis() % 1000, 1, TimeUnit.SECONDS) 以精确到秒开始,然后希望所有后续调用都会是正确的,但这有点冒险。
那么有没有办法在 Observable 之外没有我自己的线程的情况下本地执行此操作?
【问题讨论】:
-
这真的取决于调度器类型和平台。
SchedulerAPI 指定定期调度补偿花费在响应计时器滴答声上的时间,但仅操作系统调度精度可以让您每滴答声+/- 15 毫秒。为什么需要如此精确地调整执行? -
我需要执行,正是因为它触发了 Android 中的时钟等等。 +/- 15 毫秒绝对没问题,但如果你在每个周期添加 15 毫秒,那么在 50 秒后,你将有 500 毫秒的偏差,这不再合适了
-
您可以使用
interval进行一些实验,以了解它在您的上下文中是如何工作的,例如,通过在每个刻度上打印当前时间,使用timeInterval并打印随时间变化的差异。 -
它是一个 Android 应用程序,我无法做到这一点,并确保它可以在每台设备上运行数天而不会出现问题,我需要同步每个滴答声,也许我可以做 Thread.sleep(System.currentTimeMillis( ) % 1000) 在一个循环中,但看起来不是很“rx”