Android RxJava, без блокировки?

Я понял, что rxjava-android выполняет операции над отдельным потоком (при условии правильного планировщика), что приводит к неблокирующим операциям, однако быстрый и грязный тест, похоже, доказывает, что это неверно.

Я использовал следующие фрагменты кода, и в обоих сценариях пользовательский интерфейс блокировался...

Фрагмент 1

Observable observable = Observable.create(new Observable.OnSubscribe<Object>() {
  @Override
  public void call(Subscriber<? super Object> subscriber) {
    int i = 0;
    while (i == 0) {}
    subscriber.onCompleted();
  }
});
observable.subscribeOn(Schedulers.newThread());
observable.observeOn(AndroidSchedulers.mainThread());
observable.subscribe();

Фрагмент 2

Observable observable = Observable.create(new Observable.OnSubscribe<Object>() {
  @Override
  public void call(Subscriber<? super Object> subscriber) {
    SystemClock.sleep(5000);
    subscriber.onCompleted();
  }
});
observable.subscribeOn(Schedulers.newThread());
observable.observeOn(AndroidSchedulers.mainThread());
observable.subscribe();

Я что-то пропустил?

Ответ 1

Ошибка в том, что вы используете неправильный Observable. Правильный код должен быть:

Observable observable = Observable.create(new Observable.OnSubscribe<Object>() {
  @Override
  public void call(Subscriber<? super Object> subscriber) {
    int i = 0;
    while (i == 0) {}
    subscriber.onCompleted();
  }
});
observable.subscribeOn(Schedulers.newThread()).observeOn(AndroidSchedulers.mainThread()).subscribe();

Оба subscribeOn и observeOn возвращают новый Observable, который реализует их функции. Но исходный Observable не изменяется. Фактически, каждый оператор всегда будет создавать новый Observable без изменения исходного.