Понимание метода 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 выполняться на Schedulers.io()?
Какие проблемы могут возникнуть при написании такой функции?
Какой код работает в каком потоке?
Какая разница для части 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.