Понимание метода RxJava с кодом не в потоке

У меня есть функция, которая выглядит так:

public Flowable<Integer> max(int a, int b){
    // *** Part 1 - start ***
    int max = Math.max(a,b);
    // *** Part 1 - end ***
    return Flowable.defer(() -> {
        // *** Part 2 start ***
        return Flowable.just(max);  
        // *** Part 2 end ***
    });
}

Когда я сейчас подписываюсь так:

Редакция:

max(3,4).subscribeOn(Schedulers.io()).subscribe();
  1. Будет ли код из части 1 выполняться на Schedulers.io()?

  2. Какие проблемы могут возникнуть при написании такой функции?

  3. Какой код работает в каком потоке?

  4. Какая разница для части 1, если ее нет в потоке? Или это в потоке?

2 ответа

Решение

Когда я сейчас подписываюсь так:

Этот код не подписан, вы должны позвонить subscribe(),

Будет ли код из части 1 выполняться на Schedulers.io()?

Код в max() запускается, как только он вызывается в каком-то потоке: он вычисляет максимум и создает Flowable захватывая большую ценность.

Какие проблемы могут возникнуть при написании такой функции?

Часть 1 выполняется в потоке вызывающего, что может быть не тем, что вы хотели. В этот момент RxJava даже не участвует.

Какой код работает в каком потоке?

max() работает в потоке вызывающего, и больше ничего не выполняется.

Какая разница для части 1, если ее нет в потоке? Или это в потоке?

Часть 1 вышла из потока. Вы должны поместить эти вычисления в поток через fromCallable например, хотя такие тривиальные операции могут не стоить помещать в поток.

public Flowable<Integer> max(int a, int b){
    return Flowable.fromCallable(() -> 
        // *** Part 1 - start ***
        Math.max(a, b)
        // *** Part 1 - end ***
    );
}

max(3, 4)
    .subscribeOn(Schedulers.io())
    .subscribe(v -> {
        System.out.println(Thread.currentThread());
        System.out.println(v);
    });

Будет ли код из части 1 выполняться на Schedulers.io()?

Ответ: Часть первая будет работать в основном потоке или потоке вызывающего. Поскольку вы не поместили это в метод rxjava.

Какой код работает в каком потоке?

Ответ: часть 2 работает в потоке вызывающей стороны. Это может быть основной поток или новый рабочий поток.

Какая разница для части 1, если ее нет в потоке? Или это в потоке?

Ответ: Это вне потока. Вы можете получить выход из него. Но это не зависело от rxjava.

Используйте весь код внутри метода rxjava. В противном случае поток может отличаться. Этот тип простого вычисления может использоваться в главном потоке. используйте rxjava при работе с базой данных или вызовом api rest.

Другие вопросы по тегам