Mam narzędzie Observable, które robi coś bez potrzeby emitowania wartości. Mam też listę obiektów, które chcę, aby Observable działało. Więc dla wszystkich elementów tej listy: doSomething()Zachowanie funkcji onNext i onComplete
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");
}
});
i metoda, która tworzy obserwowalnym:
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();
}
});
}
Teraz gdy uruchamiam to z listy z 3 elementów uzyskać:
next
next
next
completed
co jest dobre, ponieważ tego właśnie chciałem, ale nie wiem, dlaczego to działa. Najpierw zacząłem po prostu wzywać OnComplete, ponieważ w końcu obserwowalne wykonuje swoją pracę i wykonuje je. Ale wtedy oczywiście onNext nigdy nie jest wywoływany przez subskrybenta. To samo dotyczy odwrotności.
Więc moje pytania to:
- Dlaczego onComplete tylko wezwał do ostatniego elementu listy?
- Czy istnieje lepszy sposób rozwiązania tego problemu?