41 votes

RxJava 2.x: Devrais-je utiliser Flowable ou Single / Completable?

Je suis le développement d'une application Android utilisant une Architecture Propre et je suis la migration à RxJava 2.x. Je dois faire quelques demandes de réseau pour un service soap, j'ai donc défini l'interface de l'api dans le domaine de module:

public interface SiginterApi {
    Observable<User> login(String user, String password);
    ...
    Observable<List<Campaign>> getCampaigns(List<Long> campaignIds);
}

J'ai lu qu'un réseau demande doit être faite avec "Flowable", en raison de la contre-pression la gestion, puisque c'est "à froid observables'. Sur l'autre main, je sais que le résultat de la requête sera un succès (la réponse) ou d'une erreur, donc je ne sais pas si je dois utiliser Flowable ou Single ou même Observable.

En outre, j'ai un accès base de données comme ceci:

public interface UserRepository extends Repository {
    Observable<Void> saveUser(String username, String hashedPassword, boolean logged, User user);
    ...
    Observable<User> findUser(String username, String hashedPassword);
}

Je ne sais pas si je dois utiliser Completable/Flowable/Observable en saveUser méthode et Single/Flowable/Observable en findUser méthode.

39voto

npace Points 3132

La contre-pression est que lorsque vous obtenez une source d' Observable émet des éléments plus rapide qu'un Subscriber pouvez les consommer. C'est le plus souvent un sujet de préoccupation avec chaud observables, pas froid , comme de votre réseau demandes.

Je pense que vous devriez utiliser Completable au lieu de Observable<Void> votre saveUser méthode, et d'utiliser Single pour tous les endroits où vous suivez une demande ou d'une réponse ou d'entrée/sortie du modèle. Observable doit être utilisé lorsque vous voulez vraiment un flux continu d'événements.

18voto

Nicolas Filotto Points 32004

La contre-pression se produit quand un Observable émet des éléments plus rapidement que l'exploitant ou l'abonné peut les consommer.

Sachant que, de contre-Pression n'est pas un problème dans votre cas que votre Observable émettent un seul élément afin d' Flowable n'est pas un bon candidat.

La vraie question est donc de savoir si l'utilisation Completable ou Observable pour saveUser et Single ou Observable pour findUser et ici seulement comme un résultat est attendu (succès ou échec) pour l'amour de la simplicité et de la clarté de votre API, vous devriez utiliser Completable/Single sinon il sera difficile de comprendre que la seule valeur sera émis ce qui pourrait être trompeur de votre les utilisateurs de l'API.

9voto

lmarx Points 66

La cardinalité est une manière de comprendre les différences entre Complétées, Peut-être et Unique:

  • Un Maybe<T> est juste un fait Observable avec la cardinalité 0 ou 1 c'est à dire qu'il représente un résultat qui peut être soit présent ou non.
  • Un Single<T> est Observable qui renvoie toujours un résultat, c'est à dire une cardinalité de 1.
  • Un Completable peut être interprété comme un Observable<Void> c'est à dire une cardinalité de 0.

Donc dans votre cas vous pouvez changer la signature du référentiel de cette façon:

Completable saveUser(...);

Single<User> findUser(...);

(Je n'ai pas mentionné Flowables, qui sont comme des Observables avec une contre-pression).

3voto

dmarquina Points 550

Si je comprends bien, vous devez utiliser Simple: lorsque vous êtes à peu près sûr que vous allez obtenir un point, sinon vous obtiendrez une erreur. Par exemple: OBTENIR la carte d'/:id

Peut-être: est-ce la bonne solution si vous n'êtes pas si sûr que vous obtiendrez un élément. Par exemple: OBTENIR la carte?des plaques d'immatriculation=xvar3

Complétées: lorsque vous voulez savoir si l'action a été effectuée. Par exemple: METTRE ou DETELE

Observables: lorsque la quantité d'articles n'est pas si grande.

Fluide: lorsque vous n'avez pas de connaître la quantité d'articles que vous obtiendrez.

0voto

murt Points 1283

Hmm...

Je pense que la question n'est pas trivial d'un certain temps, vous avez face à la situation est plus complexe.

Par exemple. Enregistrer l'utilisateur (RESTE) > Enregistrer utilisateur (SQLlite)

Vous souhaitez peut-être de la chaîne d' Rx flux en un seul.

Donc, soit vous déclarez

1.

Flowable<Response<Void>> saveUser(String username, String hashedPassword, boolean logged, User user);

et puis l'utilisation de certains de: flatMap, contactMap, switchMap

2.

... ou je pense que peut-être préférable de ne pas confondre la classe de responsabilité (vous pouvez utiliser le même code dans de nombreux endroits)

Single<Response<Void>> saveUser(String username, String hashedPassword, boolean logged, User user);

RestService.saveUser(...)
.toFlowable() // Transform into Flowable 
.switchMap{ saveToDB() }
.subscribeBy{ ... }
.addTo( yourDisposable )

3.

Par la façon dont je suggère de ne pas utiliser Complétées dans le cas où si vous voulez avoir un joli message d'erreur de manipulation. Vous pouvez facilement enrouler Retrofit.Response<Body> en Single ou Flowable pour profiter du code de réponse du serveur

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X