web-dev-qa-db-ja.com

RxJava-オブザーバブルを毎秒出力します

Android RxJavaを使用してタイマーを作成しています。毎秒オブザーバブルを出力するためにRxJavaでタイマーを作成する必要があります。以下を試しましたが、うまくいきませんでした。間違っている?

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

コードが呼び出されていないようです。実行されたかどうか、いつ実行されたかを確認します。 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") }
    // ...
}

そしてそれは機能します:

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

また、.timeInterval()自体は指定されたレート内で連続番号を発行し、Observable.interval(...)はそれを変換して、発行の間に経過した時間間隔を発行するため、おそらく.timeInterval()は必要ありません。

23
hotkey

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つのイベントが発生する正確な時間差を保持するオブザーバブルに変換します。

1
Vesko