web-dev-qa-db-fra.com

RxJava - émet une observable chaque seconde

Je fais une minuterie dans Android en utilisant RxJava. Je dois faire une minuterie dans RxJava pour émettre une observable chaque seconde. J'ai essayé ce qui suit mais sans succès. Des idées sur ce que je fais mal? 

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

Votre code ne semble pas être appelé. Vérifiez si elle est exécutée et quand. À partir de travailler avec Observable, c'est complètement correct. 

Par exemple, je place votre extrait dans onCreate(...) de ma MainActivity:

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

Et il fonctionne:

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

De plus, vous n'avez probablement pas besoin de .timeInterval() car Observable.interval(...) émet des numéros séquentiels dans les limites du débit spécifié, et .timeInterval() le transforme pour émettre les intervalles de temps écoulés entre les émissions.

18
hotkey

Dans votre subscribe(), vous ne consommez pas l'objet longTimeInterval qui est renvoyé par l'opérateur timeInterval().

Version correcte:

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

De plus, je pense que vous n'avez pas du tout besoin de l'opérateur timeInterval(). Observable.interval() émettra un observable toutes les secondes dans votre cas, ce qui, je suppose, est ce que vous voulez. timeInterval() transforme cela en un observable qui contient la différence de temps exacte entre deux événements, je doute que vous en ayez besoin.

1
Vesko

Dans Kotlin & RxJava 2.0.2, définissez simplement un intervalle observable avec un initialDelay 0 et un period 1 émettant un élément de la liste toutes les secondes. 

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)