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
/Observable
saveUser
méthode et Single
/Flowable
/Observable
findUser
méthode.
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.
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 Observable
saveUser
et Single
ou Observable
findUser
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.
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.
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 unObservable<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).
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