2017-10-02 15 views
0
private Observable<SimpleResource> resource; 
return resource.map(new Function<SimpleResource, Flowable<Data>>() { 
    @Override 
    public Flowable<Data> apply(SimpleResource resource) throws Exception { 
    return resource.data().toFlowable(); 
    } 
}); 


    Single<Data> data(); 

je dois avoir mon résultat mais Flowable est Observable>Comment la carte Objet observable à fluide <?>?

+0

sera votre 'Observable ' émettent plus d'une fois? et 'resource.data()' retournera-t-il un 'Single '? Nous avons besoin de connaître les réponses à ces questions avant de pouvoir proposer une solution flexible – Jon

+0

@Jon resource.data seulement une fois et Observable est injecté dans ma méthode, pour rendre asynchrone Dependency Injection. –

Répondre

1

Puisque vous avez mentionné que data() retourne un Single, vous devez transformer tous les flux uniques en un seul grand flux. Pour transformer les flux en cours d'eau, nous utilisons généralement l'opérateur flatmap:

resource.flatMapSingle(
      new Function<SimpleResource, Single<Data>>() { 
       @Override 
       public Single<Data> apply(SimpleResource resource) throws Exception { 
        return resource.data(); 
       } 
      } 
    ).toFlowable(BackpressureStrategy.BUFFER); 
+0

merci Jon Je ne pouvais pas toujours comprendre quand utiliser Observable, quand Flowable, ou il y a quelques fonctions de RX qui fonctionnent avec Observables mais pas avec Flowables, mais vous pouvez travailler avec Observables puis le convertir en Flowables, je ne ' t comprendre comment cela fonctionne conversion à la fin de fluide, et il ne pouvait pas effectuer? –

+0

Pour le dire simplement: 'Observable' est quand vous avez un flux qui va émettre de nombreux éléments ... mais à un rythme raisonnable. 'Flowable' est quand vous avez un flux qui peut émettre des éléments plus vite que vous ne pouvez les traiter ... de sorte que le flux devienne" obstrué "et vous avez besoin d'un' BackpressureStrategy' pour faire face à cela. – Jon

+0

merci d'expliquer, mais comment puis-je savoir qu'il va émettre des éléments plus rapidement ou non, je suppose que dans la plupart des cas c'est cas observable si c'est Retrofit demandes et fluide si j'écoute des changements de DB, n'est-ce pas? –

1

Ce que vous faites mal est l'application .toFlowable de ne pas le bon endroit.

Observable.fromCallable { 1 }.map { 
    it * 2 
}.toFlowable(BackpressureStrategy.BUFFER) 

Si vous avez différents types de données renvoyées par data (désolé pour Kotlin, mais le concept est le même)

data class A(
     val data: Single<Int> 
) { 
    constructor() : this(data = Single.fromCallable { 1 }) 
} 


val result: Flowable<Int> = Flowable 
     .fromCallable { 
      A() 
     } 
     .flatMap { 
      it.data.toFlowable() 
     } 
+0

Merci pour la réponse mais dans mon. cas data() retourne Single que j'ai besoin de convertir en Flowable, quand je fais comme vous l'avez mentionné, je deviens Flowable > mais j'ai besoin de Flowable

+1

'resource.map (SimpleResource :: data) .toFlowable (BackpressureStrategy.BUFFER) '. Vous devez exposer votre single avant de le convertir en fluide. – Jon

+0

On ne sait pas ce que vous voulez dire en publiant cet exemple, S'il vous plaît pourriez-vous expliquer un peu de façon différente @Georgy Savatkov –