Comment faire pour arrêter et reprendre Observables.intervalle en prononçant les tiques
Cela va émettre un cocher toutes les 5 secondes.
Observable.interval(5, TimeUnit.SECONDS, Schedulers.io())
.subscribe(tick -> Log.d(TAG, "tick = "+tick));
Pour l'arrêter, vous pouvez utiliser
Schedulers.shutdown();
Mais alors tous les Planificateurs s'arrête et il n'est pas possible de reprendre le tic-tac plus tard. Comment puis-je arrêter et reprendre le prononçant "gracieusement"`?
- Je pense que la meilleure réponse à ce qui devrait être celui-ci: stackoverflow.com/questions/35782767/..., où Scan() est utilisé, donc il n'y a pas besoin d'accumuler une valeur à l'extérieur (comme suggéré dans la meilleure réponse)
Vous devez vous connecter pour publier un commentaire.
Voici une solution possible:
Observable.interval
est un froid observables, de sorte que vous désabonner, il arrête ses émissions. Dans le même temps, vous pourriez probablement compter sur la mise en œuvre deSubscription
(ouDisposable
dans RxJava 2) pour y jeter la référence à la observables surunsubscribe()
(dispose()
). Ou vous pouvez null lesubscription
de référence et de le rendre GC-admissibles pour assurer, de concert avec les observables sont stockées.lastTick
comme Atomique ? Je pensais que toutes lesvolatile
Atomiques et les choses ont été gérées par Rx directement.volatile
ne sont pas assez fort, et l'accès doit être synchronisé ou organisés par le Java disponible simultanéité de l'Api. Plus sur levolatile
tutorials.jenkov.com/java-concurrency/....Il y a quelques temps, j'ai également été à la recherche pour le type de RX "timer" des solutions, mais non d'entre eux a répondu à mes attentes. Donc là, vous pouvez trouver mon propre solution:
Vous pouvez définir
switch
àfalse
de suspendre le tic-tac ettrue
la reprendre.Voici une autre façon de le faire, je pense.
Lorsque vous vérifiez le code source, vous trouverez intervalle() l'aide de la classe OnSubscribeTimerPeriodically. Le code de la clé ci-dessous.
Ainsi, vous pourrez voir, si tu veux cannel la boucle, qu'en jetant une nouvelle exception en onNext(). Exemple de code ci-dessous.
Puis vous verrez ceci:
Désolé c'est en RxJS au lieu de RxJava, mais le concept sera le même. J'ai adapté cette de apprenez-rxjs.io et ici c'est sur codepen.
L'idée est que vous commencez avec deux flux d'événements click,
startClick$
etstopClick$
. Cliquez sur chaque produit sur lestopClick$
stream obtenir mappé à un vide observables, et clique surstartClick$
chaque être substitués à lainterval$
flux. Les deux en conséquence, les flux d'obtenirmerge
-d ensemble dans un observables-de-observables. En d'autres termes, un nouveau observable de l'un des deux types sera émis à partir demerge
chaque fois qu'il y a un clic. La résultante observable passera parswitchMap
, qui commence à l'écoute de cette nouvelle observables et arrête d'écouter tout ce qu'il était à l'écoute de avant de. Switchmap permettra également de commencer à fusionner les valeurs de cette nouvelle observables sur ses flux de données existant.Après le passage,
scan
seulement ne voit jamais l'incrémentation de la valeur émise parinterval$
, et il ne voit pas de valeurs lorsque "arrêt" a été cliqué.Et jusqu'au premier clic,
startWith
va commencer émettant des valeurs de$interval
, juste pour faire bouger les choses:Et voici le code HTML
Vous pouvez utiliser takeWhile et boucle jusqu'à ce que les conditions est vrai