2017-09-15 9 views
0

Si je fais quelque chose comme ceci:Comment préserver rx Scheduler sans l'avoir comme paramètre de méthode?

Observable.just(1) 
.flatMap(
    //inner chain 
    Observable.just(2) 
     .subscribeOn(Schedulers.newThread()) 
) 
.map(// we are in the inner chain thread! //) 
.subscribeOn(Schedulers.newThread()) 
.subscribe() 

puis filetage intérieur sera « fuite » à la chaîne principale observable. Comment conserver le fil d'origine?

Merci d'avance!

+0

Que voulez-vous dire «fuite»? Voulez-vous dire une fuite de mémoire? Une autre fuite de ressources? –

Répondre

1

Vous devez spécifier le même programmateur avant et après la flatMap

Scheduler scheduler = ... 

Observable.just(1) 
    .subscribeOn(scheduler) 
    .flatMap(v -> Observable.just(2).subscribeOn(newThread())) 
    .observeOn(scheduler) 
    .subscribe() 

Si vous voulez revenir au même fil exact, vous pouvez spécifier un seul programmateur fileté:

scheduler = Schedulers.from(Executors.newSingleThreadedExecutor()); 

utiliser le pas vraiment pour-public-consommation

scheduler = new SingleScheduler(); 

ou prenez l'un des planificateurs standard et utilisez les SharedScheduler du projet d'extension RxJava 2:

scheduler = new SharedScheduler(Schedulers.computation()); 
+0

Ouais, mais le problème est subscribeOn() de la chaîne principale est invoqué quelque part avec subscribe() (par exemple dans le présentateur) et il semble que vous voulez appliquer de nouveaux opérateurs avec un nouveau scheduler dans un module différent (pas un présentateur). façon native de conserver le planificateur que le présentateur spécifie, sauf pour le passer à travers args, ce qui est triste. – blinker

+0

Votre API doit être repensée pour permettre la personnalisation de ce planificateur, ou laisser au consommateur le soin de définir via subscribeOn. – akarnokd