2017-10-12 12 views
0

J'ai des doutes concernant le fonctionnement de l'opérateur subscribeOn. J'ai lu un article à ce sujet.Comment fonctionne subscribeOn

Le observeOn est assez facile à comprendre, il ne change que le downstram, et changer affecte à tous les downstream.

Mais comme dit dans l'article subscribeOn can be put in any place in the stream because it affects only the time of subscription.:

Pour comprendre cela, je l'ai fait un samlpe et essayé connecter le fil à chaque point de temps.

  Observable.just("Hello") 
        .map(s -> { 
         Log.d(TAG, s + " in " + Thread.currentThread()); 
         return 1; 
        }) 
        .subscribeOn(Schedulers.newThread()) 
        .map(integer -> { 
         Log.d(TAG, integer + " in " + Thread.currentThread()); 
         return true; 
        }) 
        .map(aBoolean -> { 
         Log.d(TAG, aBoolean + " in " + Thread.currentThread()); 
         return 11.0; 
        }) 
        .subscribeOn(Schedulers.computation()) 
        .subscribe(aDouble -> { 
         Log.d(TAG, "accept in " + Thread.currentThread()); 
         Log.d(TAG, "accept: " + aDouble); 
        }); 

Le résultat est

    Hello in Thread[RxNewThreadScheduler-1,5,main] 
       1 in Thread[RxNewThreadScheduler-1,5,main] 
       true in Thread[RxNewThreadScheduler-1,5,main] 
       accept in Thread[RxNewThreadScheduler-1,5,main] 
       accept: 11.0 

Ici, je suis deux fois l'application subscribeOn, mais à chaque fois que le premier a ajouté un semble être appliqué tout au long du cours d'eau.

Quelqu'un peut-il s'il vous plaît expliquer en termes simples comment cela fonctionne réellement, puisque je suis un débutant et difficile à digérer cela!

Merci à l'avance

+0

si je me souviens bien, 'subscribeOn' décrit le début, i.e. thread qui commencera les émissions. seul le premier sera utilisé s'il y a plusieurs déclarations. –

+0

le 'subscribeOn' le plus proche des gains observables. la seconde est ignorée – Raghunandan

+0

SubscribeOn sera utilisé pour créer l'observable. La création n'est donc possible qu'à partir du thread, donc seulement subscribeOn est possible pour un observable. –

Répondre

2

subscribeOn: Si vous avez plusieurs subscribeOn alors le premier prend effet. Si vous voulez changer le planificateur sur le flux après avoir fait un subscribeOn, alors jetez un oeil à observeOn

observeOn: Il change le Scheduler en aval.

Par exemple:

just("Some String") // Computation 
    .subscribeOn(Schedulers.computation()) // it changes scheduler to computation beginning from source to observer. 
    .map(str -> str.length()) // Computation 
    .observeOn(Schedulers.io) //change the scheduler from here till the observer 
    .map(length -> 2 * length) // io 
    .subscribe(number -> Log.d("", "Number " + number));// io