使用不在流中的代码了解RxJava方法

时间:2018-02-06 12:53:16

标签: rx-java2

我有一个看起来像这样的函数:

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. 什么代码在哪个线程中运行?

  5. 如果第1部分不在流中,有什么区别?或者是在流中?

2 个答案:

答案 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。