我正在使用RxJava在Android中制作计时器。我需要在RxJava中创建一个计时器,每秒发出一个可观察量。我尝试过以下但没有运气。对我做错了什么的想法?
Observable.interval(1000L, TimeUnit.MILLISECONDS)
.timeInterval()
.observeOn(AndroidSchedulers.mainThread())
.subscribe({Log.d(LOG_TAG, "&&&& on timer") })
答案 0 :(得分:19)
您的代码似乎没有被调用。检查是否执行以及何时执行。在使用Observable
时,它是完全正确的。
例如,我将您的代码段放在onCreate(...)
的{{1}}内:
MainActivity
它有效:
此外,您可能不需要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)