RxJava 1 и 2 с разными результатами для Completable.andThen () - PullRequest
0 голосов
/ 13 июня 2019

Я создал следующий класс для демонстрации проблемы:

public class TestRx {

    public void run() {
        // RxJava2
        new CompositeDisposable().add(completableRxJava2()
                .subscribeOn(io.reactivex.schedulers.Schedulers.computation())
                .andThen(testSingleRxJava2())
                .observeOn(io.reactivex.schedulers.Schedulers.newThread())
                .subscribe(
                        this::success,
                        Throwable::printStackTrace));

        // RxJava1
        new CompositeSubscription().add(completableRxJava1()
                .subscribeOn(Schedulers.io())
                .andThen(testSingleRxJava1())
                .observeOn(Schedulers.computation())
                .subscribe(
                        this::success,
                        Throwable::printStackTrace));
    }

    private io.reactivex.Completable completableRxJava2() {
        return io.reactivex.Completable.fromAction(() ->
                System.out.println("completableRxJava2 " + Thread.currentThread().getName()));
    }

    private io.reactivex.Single<String> testSingleRxJava2() {
        return io.reactivex.Single.fromCallable(() -> {
            System.out.println("testSingleRxJava2 " + Thread.currentThread().getName());
            return "END";
        });
    }

    private Completable completableRxJava1() {
        return Completable.fromAction(() ->
                System.out.println("completableRxJava1 " + Thread.currentThread().getName()));
    }

    private Single<String> testSingleRxJava1() {
        return Single.fromCallable(() -> {
            System.out.println("testSingleRxJava1 " + Thread.currentThread().getName());
            return "END";
        });
    }

    private void success(final String s) {
        System.out.println(s);
        System.out.println();
    }
}

Когда я выполнил метод run(), это вывод:

completableRxJava2 RxComputationThreadPool-1
testSingleRxJava2 RxComputationThreadPool-1
END

completableRxJava1 RxIoScheduler-2

Я не понимаю некоторыхвещи в этом результате.

  1. Почему testSingleRxJava2 не выполняется на RxNewThreadScheduler?
  2. Почему RxJava1 не выполняет метод testSingleRxJava1?

Иногда вывод еще более запутан, и результат только такой:

completableRxJava2 RxComputationThreadPool-1
testSingleRxJava2 RxComputationThreadPool-1
END

Нет вывода RxJava1.

Почему это происходит?

Версия RxJava1: 1.3.8 Версия RxJava2: 2.2.9

1 Ответ

2 голосов
/ 13 июня 2019
  1. Почему testSingleRxJava2 выполняется не на RxNewThreadScheduler?

observeOn влияет на последующие операции, поэтому, если вы хотите, чтобы testSingleRxJava2 выполнялся в новом потоке, вы должны изменитьВаш код для:

    .observeOn(io.reactivex.schedulers.Schedulers.newThread())
    .andThen(testSingleRxJava2())
Почему RxJava1 не выполняет метод testSingleRxJava1?

это может быть потому, что когда вы выполняете этот код, основной поток завершает работу до того, как поток io получит возможность напечатать, попробуйтедобавив Thread.sleep(1000) в конце вашего метода run, и он должен последовательно вывести его

...