Closed
Description
Recently I came across following issue while using combineLatestDealyError
operator. This code has been tested on Android, Nexus 5x running OS 6.0.1.
Observable<Boolean> errorObservable = Observable.create(subscriber -> {
subscriber.onError(new NullPointerException());
});
Observable timeoutObservable = Observable.create(subscriber -> {
subscriber.onNext(true);
subscriber.onCompleted();
})
.delay(5, TimeUnit.SECONDS, AndroidSchedulers.mainThread())
.doOnNext(result -> Log.d("Combine", "Delay emitted"));
Observable<Object> zippedObservable = Observable.zip(
Observable.just(true), timeoutObs,
(flag1, flag2) -> {
Log.d("Combine", "On Zip emitted");
return new Object();
});
return Observable.combineLatestDelayError(
Arrays.asList(errorObservable, zippedObservable),
result -> {
Boolean flag1 = (Boolean) result[0];
Object object = result[1];
Log.d("Combine", "Result of errorObservable: " + flag1);
Log.d("Combine", "Result of zippedObservable: " + object);
return null;
}).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<Object>() {
@Override
public void onCompleted() {
Log.d("Combine", "OnCompleted");
}
@Override
public void onError(Throwable e) {
Log.d("Combine", "OnError");
}
@Override
public void onNext(Object o) {
Log.d("Combine", "OnNext");
}
});
This piece of code is trying to simulate callbacks using delays - for example Android Pay availability callback.
Problem here arises once this code is run. The log will be:
OnError
Delay emitted
On Zip emitted
This is quite contradictory to the docs that state that expected behavior should be:
Delay emitted
On Zip emitted
OnError
The expected result does happens if you add subscriber.onNext(true)
to the errorObservable
before subscriber.onError...