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

je développe une application Android utilisant une Architecture propre et je la migrerai vers 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 "<!-- 2", à cause de la gestion de la contre-pression puisque c'est un "observable du froid". D'un autre côté, je sais que le résultat de la requête sera un succès (avec la réponse) ou une erreur, donc je ne sais pas si je devez utiliser Flowable ou Single ou encore Observable.

de plus, j'ai un accès à une base de données comme celui-ci:

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/ObservablesaveUser méthode et Single/Flowable/ObservablefindUser méthode.

27
demandé sur akarnokd 2017-03-01 10:25:38

5 réponses

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

je pense que vous devriez utiliser Completable au lieu de Observable<Void> dans votre saveUser la méthode et de l'utiliser Single pour tous les endroits où vous suivez un pattern requête/réponse ou input/output. Observable doit être utilisé lorsque vous voulez vraiment un flux continu des événements.

21
répondu npace 2017-03-21 14:50:54

contre-pression se produit lorsque Observable émet des articles plus rapidement qu'un opérateur ou un abonné ne peut les consommer.

sachant cela, la Contre-Pression n'est pas un problème dans votre cas comme votre Observable n'émettra qu'un seul article donc Flowable n'est pas un bon candidat.

la vraie question est donc de savoir s'il faut utiliser Completable ou ObservablesaveUser et Single ou ObservablefindUser et voici qu'un seul résultat (succès ou échec) par souci de simplicité et de clarté de votre API, vous devez utiliser Completable/Single sinon il sera difficile de comprendre qu'une seule valeur sera émise qui pourrait être trompeuse pour les utilisateurs de votre API.

15
répondu Nicolas Filotto 2018-08-07 17:14:44

D'après ce que j'ai compris, vous devriez utiliser Single: quand vous êtes assez sûr que vous allez obtenir un article, sinon vous obtiendriez 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?plaque d'immatriculation=xvar3

Complétées: lorsque vous voulez savoir si l'action a été effectuée. Eg: PUT or DETELE

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

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

1
répondu Diego Marquina 2018-02-21 22:20:34

la cardinalité est une façon de comprendre les différences entre Complétées,Peut-être et :

  • Maybe<T> est juste un Observable avec cardinalité 0 ou 1 c'est-à-dire qu'il représente un résultat qui peut être présent ou non.
  • Single<T> est un Observable qui renvoie toujours un résultat i.e. une cardinalité de 1.
  • 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é Flowable s qui sont comme Observable s avec contre-pression).

1
répondu lmarx 2018-04-04 12:04:52

Hmm...

je pense que la question n'est pas anodine alors que vous avez fait face à une situation plus complexe.

par exemple. Enregistrer utilisateur (RESTE) > Enregistrer utilisateur (SQLlite)

Vous pouvez chaîne RX se transforme en un seul.

Donc, soit vous déclarez

1.

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

et puis utiliser un peu de: flatMap, contactMap, switchMap

2.

... ou je pense que peut être plus préférable de ne pas confondre la responsabilité de classe (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.

d'ailleurs je suggère de ne pas utiliser Completable au cas où si vous voulez avoir un traitement d'erreur agréable. Vous pouvez facilement envelopper Retrofit.Response<Body>Single ou Flowable pour profiter de la réponse du code sur le serveur

0
répondu murt 2017-11-27 14:32:38