J'essaie de déchiffrer la fonction suivante:
Subscription getCar(id, Observer<Car> observer) {
return getCarDetails(id, new Observer<CarDetails> {
@Override
onNext(CarDetails details) {
observer.onNext(details.getCar());
} });
}
J'ai une bonne introduction à rxjava de http://blog.danlew.net/2014/09/15/grokking-rxjava-part-1/ mais il ne fait que mentionner Observer en passant, disant que vous ' Vous utiliserez la plupart du temps un abonné pour les produits grand public émis par un observable.
Quelqu'un peut m'expliquer
Javadoc fait en sorte que cela ressemble à un abonné. Le javadoc pour abonné indique qu'il implémente l'observateur et l'abonnement. Je suis très confus.
[~ # ~] édité [~ # ~] : avec le commentaire de @ Alrid
tl; dr
public abstract class Subscriber<T> implements Observer<T>, Subscription
Donc, Subscriber est une implémentation de Observer , avec une sémantique supplémentaire sur l'abonnement (il s'agit davantage d'un désabonnement). Le code de votre question montre simplement qu'il passe l'interface Observer
à la place de la mise en oeuvre (pratique de programmation habituelle).
De plus, ce code retourne un Subscription
, peut-être parce que l'auteur de ce code pensait que le client ne devrait avoir accès qu'aux méthodes Subscription
, sans accès aux éléments produits par l'observable. Cela peut être une erreur de programmation.
longue histoire
Vraiment, vous devriez lire le contenu de ce site Web (ou de ce livre): http://www.introtorx.com Il s’agit de Rx.Net, mais les concepts sont les mêmes, ils ont été créés par Erik Les développeurs Meijer et RxJava ont suivi eux (si applicable à la Java)).
Cette page va vous intéresser (c'est le deuxième chapitre): KeyTypes
Ici, vous allez lire dans les premiers paragraphes:
Lorsque vous travaillez avec Rx, vous devez comprendre deux types de clé et un sous-ensemble de types auxiliaires qui vous aideront à apprendre la Rx plus efficacement. IObserver et IObservable constituent les éléments de base fondamentaux de Rx, tandis que les implémentations d’ISubject réduisent la courbe d’apprentissage des développeurs débutant dans Rx.
...
Essentiellement, Rx est construit sur les fondements du modèle Observer. .NET expose déjà d'autres moyens d'implémenter le modèle Observer, tels que les délégués de multidiffusion ou les événements (qui sont généralement des délégués de multidiffusion).
Même si les types/API sont un peu différents, vous en apprendrez beaucoup avec ce livre, probablement beaucoup plus qu'avec certains blogs.
Qu'est-ce que cela book ne dites pas (... car c'est dans l'implémentation de RxJava)
Le développeur principal de RxJava a alors introduit une légère variation (voir PR # 792 ) qui permettait de distinguer deux types de contrats:
Observer
Subscription
Ce changement a permis de mieux exprimer/diviser ces préoccupations des classes d'implémentation de la bibliothèque RxJava.
Cependant, en tant qu'utilisateur de bibliothèque, l'utilisation des implémentations réelles de la bibliothèque RxJava devrait suffire.
L'implémentation d'un abonné nécessite beaucoup plus de connaissances, de travail et de soins. En effet, la sémantique de l'abonnement est très importante selon le type de source observable (chaud ou froid? Coûteux à créer?)
Exposer Subscriber
plutôt que Observer
dans les cas ci-dessus n'interférera pas avec le code dans la plupart des cas, mais ce n'est pas son utilisation prévue, à moins que ces sémantiques de désabonnement ne soient nécessaires. Mais finalement, implémenter un Subscriber
, et peut impliquer de tomber dans certains pièges tels que:
(Edit: Ceci n’est apparemment valable que pour RxJava 1.)
Un Observer
est un objet pouvant extraire des données d'une source de données (un Observable
). La source de données lui envoie des données en appelant la fonction onNext()
de l'observateur.
Un Subscriber
est un Observer
qui peut également se désabonner de cette source de données (via l'interface Subscription
.).
La fonction getCar()
essaie de renvoyer des voitures, mais il n'y a pas de méthode directe pour le faire. Mais il existe une fonction pour obtenir les détails de la voiture (getCarDetails()
) qui appellera un observateur avec tous les détails de la voiture. Ainsi, il appelle cette fonction et lui transmet un observateur qui, lorsqu'il récupère des données, récupère les données de la voiture dans les détails et les transmet à son propre observateur.
Dans RxJava 2 org.reactivestreams.Subscriber
est une interface conforme à spécification des flux réactifs .
La principale différence avec Observable
est que le nouveau Subscriber
prend en charge la contrepression.
Observer
est abonné à Observable
et Subscriber
est abonné à Flowable
(implémente org.reactivestreams.Publisher
).
Voir la description détaillée ici .
De plus, dans RxJava2 , si vous souhaitez pouvoir vous désabonner, vous devez utiliser ResourceObserver
pour Observable
et ResourceSubscriber
pour Flowable
.
Vérifiez ceci question