Subscribewith Vs abonnez-vous à RxJava2(Android)?
Quand appeler le subscribeWith méthode plutôt que la plaine s'abonner? Et qu'est-ce que le cas d'utilisation?
compositeDisposable.add(get()
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe(this::handleResponse, this::handleError));
VS
compositeDisposable.add(get()
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
// .subscribe(this::handleResponse, this::handleError);
.subscribeWith(new DisposableObserver<News>() {
@Override public void onNext(News value) {
handleResponse(value);
}
@Override public void onError(Throwable e) {
handleError(e);
}
@Override public void onComplete() {
//dispose here ? why? when the whole thing will get disposed later
//via compositeDisposable.dispose(); in onDestroy();
}
}));
Merci
Ajouté Plus Tard
Conformément à la documentation, à la fois retour jetables SingleObserver instances:
@CheckReturnValue
@SchedulerSupport(SchedulerSupport.NONE)
public final <E extends SingleObserver<? super T>> E subscribeWith(E observer) {
subscribe(observer);
return observer;
}
@SchedulerSupport(SchedulerSupport.NONE)
public final Disposable subscribe(final Consumer<? super T> onSuccess, final Consumer<? super Throwable> onError) {
ObjectHelper.requireNonNull(onSuccess, "onSuccess is null");
ObjectHelper.requireNonNull(onError, "onError is null");
ConsumerSingleObserver<T> s = new ConsumerSingleObserver<T>(onSuccess, onError);
subscribe(s);
return s;
}
Où ConsumerSingleObserver classe implémente SingleObserver et Jetable.
- Grâce à @Simbatrons réponse, pour résumer le specefic cas d'utilisation (de ce que j'ai underestood) si vous disposez d'un même observateur que vous souhaitez lier à différents observables, l'utilisation subscribeWith. (si plusieurs Observables pouvez utiliser le même observateur de mise en œuvre). veuillez ajouter vos commentaires si vous pensez que ce n'est pas le seul differnce en cas d'utilisation
- Je me demande la même chose à mon avis votre premier extrait de code est plus propre à l'utilisation des expressions lambda etc. Donc oui, il semble que les rares cas où vous voulez réutiliser le même Observateur est le seul moment où vous en avez besoin .subscribeWith()? C'est bizarre que les documents ne sont pas vraiment parler de la surcharge variante de s'abonner que renvoie le Jetable si. Au lieu de cela ils ont juste point de vous pour utiliser la nouvelle et difficile à manier subscribeWith()
Vous devez vous connecter pour publier un commentaire.
Observables#abonnez-vous explication:
Dans votre premier extrait de code:
Vous êtes réellement en utilisant une des plusieurs surchargé
Observable#subscribe
méthodes:Il y en a une autre qui prend également en un
Action
pour effectuer onComplete:Et une autre option vous permet de tout simplement passer une
Observer
(REMARQUE: la méthode void) (Edition 2 - cette méthode est définie dansObservableSource
, qui est l'interface quiObservable
s'étend.)Dans le deuxième extrait de code dans votre question, vous avez utilisé le
subscribeWith
méthode qui retourne simplement l'Observer
passée dans (pratique/mise en cache, etc):Observateur#onComplete explication:
Observateur#onComplete est appelé après que l'Observable a émis tous les éléments dans le flux.
De la java doc:
Ainsi, par exemple, si le
get()
dans vos extraits de code renvoyé unObservable
qui l'a émis plusieursNews
objets, chacun sera traité dans leObserver#onNext
. Ici vous pouvez traiter chaque élément.Après qu'ils ont tous été traités (et en supposant qu'aucune erreur ne s'est produite), puis le
onComplete
sera appelée. Ici vous pouvez effectuer toutes les actions supplémentaires que vous devez faire (pour exemple. mise à jour de l'INTERFACE utilisateur), sachant que vous avez traité tous lesNews
objets.Ce n'est pas à confondre avec
Disposable#dispose
qui est appelé lorsque l'observable flux extrémités (complet/erreur), ou manuellement par vous-même pour mettre fin à l'observation (c'est là que leCompositeDisposable
vient car il vous aide à vous débarrasser de tous vosDisposable
s qu'elle contient à la fois).Si dans votre scénario de la
get()
sera de retour uneObservable
qui émet seulement un seul élément, alors au lieu d'utiliser unObservable
, envisager l'utilisation d'unio.reactivex.Single
où vous ne traiter que d'un point (enonSuccess
), et n'aurez pas besoin de spécifier unAction
pour onComplete 🙂Modifier: réponse à votre commentaire:
De clarifier davantage la
subscribeWith
explication, ce que je voulais dire, c'est qu'il sera consommer leObserver
objet que vous avez passé dans lesubscribeWith
(exactement comme lesubscribe
méthode) cependant, il va en outre de retour que même l'Observateur le droit de retour pour vous. Au moment de la rédaction, la mise en œuvre de subscribeWith est:Par conséquent,
subscribeWith
peut être utilisé de façon interchangeable avecsubscribe
.La
subscribeWith
javadoc donne des exemple d'utilisation:Voir ici l'utilisation de
subscribeWith
sera de retour que mêmeResourceObserver
objet qui a été instancié. Cela donne la commodité de l'exécution de l'abonnement & ajout de laResourceObserver
à laCompositeDisposable
dans une ligne (notez queResourceObservable
implémenteDisposable
.)Edit 2 Répondre au second commentaire.
ObservableSource#subscribe(Observer <? super T> observer)
ne PAS retour d'unObserver
. C'est une méthode void (Voir la NOTE sous le Observables#abonnez-vous explication ci-dessus). Alors que laObservable#subscribeWith
NE retour de laObserver
.Si nous étions à réécrire l'exemple de l'utilisation du code à l'aide
ObservableSource#subscribe
au lieu de cela, nous aurions du le faire en deux lignes comme suit:Alors que la
Observable#subscribeWith
méthode fait commode pour nous de faire le ci-dessus en une seule lignecomposite.add(source.subscribeWith(rs));
Il peut devenir confus avec tous les surchargé de s'abonner à des méthodes qui ressemblent quelque peu similaires, cependant il y a des différences (dont certains sont subtiles). En regardant le code et la documentation aide à fournir la distinction entre eux.
Modifier 3 un Autre exemple de cas d'utilisation pour subscribeWith
La
subscribeWith
méthode est utile lorsque vous avez un spécifique de la mise en œuvre d'unObserver
que vous souhaitez réutiliser. Par exemple, dans l'exemple de code ci-dessus, il a fourni une mise en œuvre spécifique deResourceObserver
dans l'abonnement, héritant ainsi ses fonctionnalités tout en vous permettant de gérer onNext onError et onComplete.Un autre exemple d'utilisation: pour l'exemple de code dans votre question, que si vous voulez faire le même abonnement pour la
get()
réponse à plusieurs endroits?Au lieu de copier la
Consumer
implémentations pour onNext et onError à travers différentes catégories, ce que vous pouvez faire à la place est de définir une nouvelle classe, par exemple.Maintenant, chaque fois que vous faites cela
get()
demande, il vous suffit de vous abonner en faisant:Voir le code est simple maintenant, vous maintenir la séparation de la responsabilité pour le traitement de la réponse, et vous pouvez désormais réutiliser
GetNewsObserver
où vous le souhaitez.