我有一个看起来像这样的函数:
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部分不在流中,有什么区别?或者是在流中?
答案 0 :(得分:1)
当我现在订阅时:
该代码没有订阅,您必须致电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 :(得分:0)
第1部分的代码是否会在Schedulers.io()上运行?
Ans:第一部分将在主线程或调用者线程上运行。因为你没有把它放在rxjava方法之下。
什么代码在哪个线程中运行?
Ans:第2部分在调用者线程上运行。它可能是主线程或新的工作线程。
如果第1部分不在流中,有什么区别?或者是在流中?
Ans:它不在流中。你可以从它得到输出。但这并不依赖于rxjava。
使用rxjava方法中的所有代码。否则流量可能不同。这种简单的计算可以在主线程上使用。在使用数据库或rest api调用时使用rxjava。