2017-07-15 1 views
0

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à.

Répondre

2

Avez-vous essayé quelque chose dans quelque chose comme ça?

publishSubject 
.observeOn(Schedulers.computation()) 
.map(...) 
.toFlowable(BackpressureStrategy.LATEST) 
.observerOn(AndroidSchedulers.mainThread()) 
.subscribe(...); 

Cela fera en sorte que le calcul se fait, mais l'abonnement ne sera pas recevoir des articles qui sont trop loin dans le temps.

+3

Presque. Vous devez limiter la lecture anticipée sur 'observerOn (mainThread(), false, 1)' sinon le tampon interne conservera probablement les valeurs intermédiaires. – akarnokd

+0

@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

+0

@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 ... –