Today I got stucked as I was in trouble about AndroidSchedulers.mainThread()
Obervable.create(emitter -> {
emitter.onNext(1);
emitter.onNext(2);
emitter.onNext(3);
// Thread.sleep(10);
emitter.onError(new RuntimeException("error"));
}).subscribeOn(io())
.doOnEach(logger)
.observeOn(AndroidSchedulers.mainThread())
.doOnEach(logger)
.subscribe();
Former logger printed out 1, 2, 3 and the error in order, but the latter won't. Instead some of onNext
are ignored and onError
is delivered earlier.
Is it intentional? I don't believe it. How can I avoid this behavior?
If I comment out Thread.sleep(10)
, it perfectly works.
Appendix
Thanks to akarnokd, I read JavaDoc carefully and found that's intentional as Observable#observeOn(Scheduler)
will prioritize onError
than onNext
. I should have used Observable#observeOn(Scheduler, boolean)
overload to enforce all the events are observed in strict ordering.