RX Java -subscribeOn和observeOn的不同行为

时间:2018-07-11 08:39:09

标签: java rx-java observable

我是RX Java的新手,我一直在尝试使用observeOn和subscribeOn方法。我已经读到它们之间的区别是它们在设置了调度程序(observeOn)之后会影响整个链(subscribeOn)或仅影响链的一部分。那么为什么下面的代码可以正常执行(打印当前线程):

Observable obs = Observable.from(Arrays.asList("element", "2nd element"));
obs.observeOn(Schedulers.newThread())
                .map(x -> x.toString().toUpperCase())
                .subscribe(x -> System.out.println("NT:" + Thread.currentThread().getName() + x));

虽然此代码不显示任何内容:

Observable obs = Observable.from(Arrays.asList("element", "2nd element"));
obs.subscribeOn(Schedulers.newThread())
            .map(x -> x.toString().toUpperCase())
            .subscribe(x -> System.out.println("NT:" + Thread.currentThread().getName() + x));

2 个答案:

答案 0 :(得分:1)

您确定this code doesn't print anything吗?

我尝试了以下代码:

Observable obs = Observable.from(Arrays.asList("element", "2nd element"));
obs.subscribeOn(Schedulers.newThread())
  .map(x -> x.toString().toUpperCase())
  .subscribe(x -> System.out.println("NT:" + Thread.currentThread().getName() + x));

Thread.sleep(5000);

输出:

  

NT:RxNewThreadScheduler-1ELEMENT
  NT:RxNewThreadScheduler-12ND ELEMENT

也许您忘记了sleep或做了其他工作使应用程序等待新的RxJava线程完成?

答案 1 :(得分:0)

基本上,可观察值(更具体地讲,可观察值)是延迟计算。因此, .subscribeOn()定义了将在哪个调度程序/线程上执行此计算,而 .observeOn()定义了将在哪个调度程序/线程上接收其结果。例如,网络请求应在您添加 .subscribeOn(Schedulers.io)指定的 Schedulers.io 上运行,并且您想通过指定 .observeOn(AndroidShedulers.main)