RxJava - 每秒发出一个可观察量

时间:2016-02-28 21:39:55

标签: java android system.reactive rx-java kotlin

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

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

3 个答案:

答案 0 :(得分:19)

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

例如,我将您的代码段放在onCreate(...)的{​​{1}}内:

MainActivity

它有效:

https://www.dropbox.com/s/jxkm5ol8l5idyji/observable_interval.png?dl=0

此外,您可能不需要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(...)只会转换它以发出排放之间经过的时间间隔。

答案 1 :(得分:1)

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

正确版本:

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

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

答案 2 :(得分:0)

在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)