RxJava - 每秒发出一个 observable

RxJava - emit an observable every second

我正在使用 RxJava 在 Android 中制作一个计时器。我需要在 RxJava 中制作一个计时器,每秒发出一个可观察到的值。我尝试了以下但没有运气。对我做错了什么有什么想法吗?

Observable.interval(1000L, TimeUnit.MILLISECONDS)
          .timeInterval()
          .observeOn(AndroidSchedulers.mainThread())
          .subscribe({Log.d(LOG_TAG, "&&&& on timer") })

在您的 subscribe() 中,您不使用 timeInterval() 运算符返回的 longTimeInterval 对象。

正确版本:

.subscribe(longTimeInterval -> {
     Log.d(LOG_TAG, "&&&& on timer"); 
}

此外,我认为您根本不需要 timeInterval() 运算符。 Observable.interval() 将在您的情况下每秒发出一个可观察的,我想这就是您想要的。 timeInterval() 将其转换为一个包含两个事件发生之间确切时间差的可观察对象,我怀疑您是否需要它。

你的代码似乎没有被调用。检查它是否执行以及何时执行。在使用 Observable 时,它是完全正确的。

例如,我将您的代码段放在 MainActivityonCreate(...) 中:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    Observable.interval(1000L, TimeUnit.MILLISECONDS)
            .timeInterval()
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe { Log.d("tag", "&&&& on timer") }
    // ...
}

有效:

此外,您可能不需要 .timeInterval(),因为 Observable.interval(...) 本身会在指定速率内发出序列号,而 .timeInterval() 只是将其转换为发出之间经过的时间间隔排放量。

在 Kotlin & RxJava 2.0.2 中,只需定义一个带有 initialDelay 0 和 period 1 的 Observable Interval,它将每秒发出列表项。

val list = IntRange(0, 9).toList()
val disposable = Observable
    .interval(0,1, TimeUnit.SECONDS)
    .map { i -> list[i.toInt()] }
    .take(list.size.toLong())
    .subscribe {
       println("item: $it")
    }
Thread.sleep(11000)