web-dev-qa-db-fra.com

Différence entre Observable.defer et Observable.create dans Java rx

Quelqu'un peut-il m'expliquer la différence entre les méthodes defer et create dans Observable? Je n'ai pas compris quand utiliser defer et quand utiliser create ..

LES RÉFÉRENCES:

Différer: http://reactivex.io/documentation/operators/defer.html

Créer: http://reactivex.io/documentation/operators/create.html

Je vous remercie

23
Xitrum

Donc, la distinction semble être: defer est bonne lorsque vous avez déjà quelque chose qui crée/retourne un observable, mais vous ne voulez pas que ce processus se produise jusqu'à la souscription.

create est utile lorsque vous devez envelopper manuellement un processus asynchrone et créer un observable. Cette création est également différée jusqu'à la souscription.

Pour le dire autrement:

defer est un opérateur qui permet la composition différée de séquences observables.

create est une implémentation personnalisée d'une séquence observable (où la création est différée jusqu'à l'abonnement).

Donc, si vous avez une situation où vous pouvez utiliser just pour créer un Observable à partir de certains résultats/valeur ou si vous avez une couche API réseau qui renvoie un Observable de la demande, mais vous ne voulez pas que cette demande démarre avant la souscription. defer serait bon pour ces scénarios.

Si vous avez une couche d'API réseau qui pas renvoie un Observable pour une demande, mais pour laquelle vous avez besoin d'une interface Observable, vous pouvez utiliser create. Cependant, cette séquence Observable ne sera toujours pas créée avant la souscription. Si vous vouliez que cet appel réseau démarre, quel que soit l'abonnement, vous utiliseriez un mécanisme différent, comme un Subject, potentiellement qui rediffuse.

20
Bob Spryn

create (...) crée en fait Observable immédiatement.

    public final static <T> Observable<T> create(OnSubscribe<T> f) {
        return new Observable<T>(hook.onCreate(f));
    }

defer (...) accepte la fonction Factory qui renvoie Observable (Subject, etc ...), l'enveloppe avec OnSubscribeDefer et crée Observable uniquement lorsque l'abonné s'abonne, nouvel Observable pour chaque abonné.

public final static <T> Observable<T> defer(Func0<Observable<T>> observableFactory) {
    return create(new OnSubscribeDefer<T>(observableFactory));
}

Voir plus de détails ici

13
Dennis R