Android RxJavaを使用してタイマーを作成しています。毎秒オブザーバブルを出力するためにRxJavaでタイマーを作成する必要があります。以下を試しましたが、うまくいきませんでした。間違っている?
Observable.interval(1000L, TimeUnit.MILLISECONDS)
.timeInterval()
.observeOn(AndroidSchedulers.mainThread())
.subscribe({Log.d(LOG_TAG, "&&&& on timer") })
コードが呼び出されていないようです。実行されたかどうか、いつ実行されたかを確認します。 Observable
を使用する時点では、それは完全に正しいです。
たとえば、スニペットをMainActivity
のonCreate(...)
内に配置します。
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を使用して監視可能間隔を定義するだけで、毎秒リストアイテムを送信します。
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)
subscribe()
では、timeInterval()
演算子によって返されるlongTimeInterval
オブジェクトを使用しません。
正しいバージョン:
_.subscribe(longTimeInterval -> {
Log.d(LOG_TAG, "&&&& on timer");
}
_
また、timeInterval()
演算子はまったく必要ないと思います。 Observable.interval()
は、毎秒オブザーバブルを出力します。これは、あなたが望んでいることだと思います。 timeInterval()
は、2つのイベントが発生する正確な時間差を保持するオブザーバブルに変換します。