2017-04-10 3 views
1

faire quelque chose comme ceci:Abonnez-vous au même abonné 1.x rxJava il était possible rxJava 2

Observable.<Foo>create(subscriber -> { 
    ... 
    getNewObservable().subscribe(Subscribers.wrap(subscriber)); 
}) 

GetNewObservable() retour aussi Observable<Foo>

Je ne trouve pas la même approche dans rxJava 2. Il n'y a pas de méthode d'abonnement acceptant Emitter ou ObservableEmitter sur un objet Observable. Je suppose que je peux faire quelque chose comme ceci:

Observable.<Foo>create((ObservableEmitter<Foo> emitter) -> { 
    ... 
    getNewObservable().subscribe(emitter::onNext, emitter::onError, emitter::onComplete); 
}) 

Mais je me demande s'il y a une manière plus simple comme dans rxJava 1.

Merci.

+0

Qu'est-ce que vous essayez de réaliser avec cette approche non évidente? Il doit y avoir une façon beaucoup plus propre de le faire. Veuillez décrire l'objectif de votre code. –

+0

Bien sûr, il y a probablement plus de façons de contourner ce problème, mais je suis curieux de savoir s'il n'y a vraiment pas d'équivalent dans rxJava 2. Cette approche est en fait mentionnée dans [Reactive Programming with RxJava] (http://shop.oreilly.com /produit/0636920042228.do) livre. Mais revenons à mon cas, je suis en train de faire android lib et je veux avoir observable sorcière va faire une action toutes les x minutes. J'ai donc une minuterie observable pour cela. Mais le "travail" nécessite certaines autorisations à accorder. Je voulais juste vérifier les permissions d'abord et seulement si c'est ok que m'abonner à la minuterie observable. Sinon, return onError ... – bio007

+0

Que dire de ceci: 'if (permissionGranted) renvoie Observable.interval (...). Map (...); sinon renvoie Observable.error (...); '? –

Répondre

0

1) Une façon de faire ce que vous avez décrit dans les commentaires:

Observable.interval(...) 
    .map(n -> { 
      if (!permissionGranted) 
       throw new AccessDeniedException(); 
      ... // do work 
      return result; 
     }) 

2) Une autre façon de le faire:

Observable.interval(...) 
    .flatMap(n -> { 
      if (permissionGranted) { 
       ... // do work 
       return Observable.just(result); 
      } else { 
       return Observable.error(new AccessDeniedException()); 
      } 
     }) 

3) Encore une autre façon (vérifier l'autorisation une seule fois):

Observable.defer(() -> { 
      if (permissionGranted) { 
       return Observable.interval(...) 
        .map(n -> { 
         ... // do work 
         return result; 
        }); 
      } else { 
       return Observable.error(new AccessDeniedException()); 
      } 
     }) 

4) Un plus (le plus réactif ):

Completable.fromCallable(() -> { 
      if (!permissionGranted) 
       throw new AccessDeniedException(); 
      return true; // returned value does not matter 
     }) 
    .andThen(Observable.interval(...) 
        .map(n -> { 
         ... // do work 
         return result; 
        }) 
     ) 

que vous pouvez factoriser comme:

askForPermission().andThen(getNewObservable()) 
+0

Oui, vérifier l'autorisation une seule fois me suffit donc la 3ème option est la meilleure, mais pas vraiment si élégante j'espérais ... Donc il n'y a pas d'équivalent dans rxJava 2 loin que vous le savez? – bio007

+0

J'ai ajusté l'option 3 et ajouté l'option 4. Je pense que l'option 3 est la plus proche de votre intention d'origine, c.-à-d. 'Différer' la sélection de la source jusqu'à l'heure de l'abonnement. –