Le comportement de onNext et onComplete
J'ai une Observable qui fait quelque chose sans la nécessité d'émettre une valeur. Aussi, j'ai une liste d'objets, je veux que les Observables de travailler avec. Donc, pour tous les éléments dans cette liste: doSomething()
Observable.from(uris)
.flatMap(new Func1<Uri, Observable<Void>>() {
@Override
public Observable<Void> call(Uri uri) {
return createDoSomethingObservable(uri);
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe(new Observer<Void>() {
@Override
public void onCompleted() {
Log.d(TAG, "completed");
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Void aVoid) {
Log.d(TAG, "next");
}
});
Et la méthode qui crée le Observables:
Observable<Void> createDoSomethingObservable(final Uri uri) {
return Observable.create(new Observable.OnSubscribe<Void>() {
@Override
public void call(Subscriber<? super Void> subscriber) {
//doSomething
subscriber.onNext(null);
subscriber.onCompleted();
}
});
}
Maintenant quand je lance ce une Liste avec les 3 éléments-je obtenir:
next
next
next
completed
qui est bon, parce que c'est ce que je voulais, mais je ne sais pas pourquoi ça fonctionne. J'ai d'abord commencé à l'appeler juste onComplete, parce que dans la fin de l'observable fait son travail et se termine. Mais bien sûr onNext n'est jamais appelée sur l'abonné. Il en va de même pour l'inverse.
Donc mes questions sont:
- Pourquoi est onComplete que le dernier élément de la liste?
- Est-il une meilleure façon de résoudre ce problème?
OriginalL'auteur Kuno | 2015-07-23
Vous devez vous connecter pour publier un commentaire.
onComplete
est appelé pour le dernier élément parce que c'est quand les premiers à observer dans la chaîne (from(uris)
) a fini.Il est prévu que votre observables émis à partir de
flatMap
appelleraonComplete
. Une fois que c'est fait (etcall
a retourné), alors la prochaine émission defrom
peut être travaillé sur. Une foisfrom
a fini émettant des observables, il appelleonComplete
et la chaîne est fini, effectivement.OriginalL'auteur Adam S
Je pense, que petit code vous aide à comprendre le comportement de
onNext( )
etonComplete()
.Imaginons que vous ayez un
List<Uri>
. Nous allons le transformer enObservable<Uri>
manuellement.Ou de l'utilisation des expressions Lambda:
Comme vous pouvez le voir, nous sommes une itération à l'entrée de la liste, et de les appeler
onNext( )
pour chaque élément, et quand nous avons fini à la transformation de notreList
àObservable
, nous avons appeléonComplete()
P. S.
Ce code qu'une démonstration, s'il vous plaît, ne jamais l'utiliser à q
List
àObservable
. L'utilisation de l'opérateurObservable.from()
.Mise à JOUR:
Opérateur
from( )
mise en œuvre:lien:https://github.com/ReactiveX/RxJava/blob/1.x/src/main/java/rx/internal/operators/OnSubscribeFromIterable.java#L75-L87
OriginalL'auteur Alexander
onComplete
(le même queonError
) est appelée une seule fois pendant observables de la chaîne, c'est la façon dont rxjava est mis en œuvreJe pense que votre approche est correcte, donc le meilleur moyen n'est pas nécessaire.
OriginalL'auteur pjanecze