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:

  1. Pourquoi est onComplete que le dernier élément de la liste?
  2. Est-il une meilleure façon de résoudre ce problème?

OriginalL'auteur Kuno | 2015-07-23