web-dev-qa-db-fra.com

Quelle est la différence entre un observateur et un abonné?

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

  1. Qu'est-ce qu'un observateur?
  2. En quoi un observateur est-il différent d'un abonné?
  3. Que fait l'extrait de code ci-dessus?

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.

78
MarcusH

[~ # ~] é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:

  • notification -> Observer
  • (dés) souscription -> 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:

  1. dépenser des ressources pour des fonctionnalités que vous n'utiliserez pas
  2. ne peut pas hériter d'une autre classe
  3. écrire un code de désabonnement incorrect
  4. copier/coller un code incorrect ou un code correct écrit pour un contexte différent
59
Brice

(Edit: Ceci n’est apparemment valable que pour RxJava 1.)

  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.

  2. Un Subscriber est un Observer qui peut également se désabonner de cette source de données (via l'interface Subscription.).

  3. 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.

36

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 .

18
Yaroslav Stavnichiy

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

3
Beshoy Fayez