0

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.

  • Have you read the [javadoc](http://reactivex.io/RxJava/2.x/javadoc/io/reactivex/Observable.html#observeOn-io.reactivex.Scheduler-)? – akarnokd Jan 16 '18 at 16:59
  • Thanks for pointing out. I should have used `Observable#observeOn(Observer, boolean)` overload to avoid Error shortcut delivery. – liquid_amber Jan 17 '18 at 04:42

0 Answers0