J'utilise RxJava2 dans Android et j'ai le problème ci-dessous, mais ce n'est pas spécifique à Android. J'ai un PublishSubject
pour pousser tous mes événements. J'appelle le publishSubject.onNext()
dans plusieurs parties de mon code basé sur différents événements. Mais j'ai une place centrale dans mon code où je m'inscris à ces événements. Ce qui suit est le code d'abonnement:Comment traiter tous les événements de Observable dans un thread, mais obtenir la dernière valeur disponible dans un autre thread dans Rxjava?
publishSubject
.observeOn(Schedulers.computation())
.map(
// each computation takes about 10ms
// Do some computation and return a `computation` object
)
.observerOn(AndroidSchedulers.mainThread())
.subscribe(
// take the `computation` object and draw on screen
// each drawing takes about 100ms
);
Maintenant, dans le cas ci-dessus, si je l'appelle publishSubject.onNext()
100 fois, puis computation
sera fait 100 fois et le dessin à l'écran sera fait 100 fois.
Ce qui m'importe c'est le calcul 100 fois. Chaque événement doit être calculé. Mais tous les objets calculés n'ont pas besoin d'être dessinés. Lorsque le premier objet computation
est dessiné à l'écran, il faut 100ms pour dessiner dans le thread MAIN, mais à ce moment-là 10 nouveaux objets computation
sont générés dans le thread de CALCUL. Donc, la 2ème fois que je dessine sur l'écran, je ne veux pas dessiner le 2ème objet computation
, mais plutôt le dernier objet computation
disponible pour moi (probablement le 11ème objet de calcul). En bref, je cherche un moyen de faire tous les calculs tout le temps, mais dessine sur l'écran seulement le dernier objet de calcul disponible à ce moment-là.
Presque. Vous devez limiter la lecture anticipée sur 'observerOn (mainThread(), false, 1)' sinon le tampon interne conservera probablement les valeurs intermédiaires. – akarnokd
@akarnokd +1 @Tassos Cela n'a pas complètement résolu mon problème, mais merci de me pointer vers 'Flowable'. C'est ce que je cherchais. – Henry
@akarnokd En effet, merci de le signaler. Initialement, je plaçais 'toFlowable' pas le deuxième commutateur du planificateur, mais alors je pensais à tous ces commutateurs de contexte inutiles ... –