我是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));
答案 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)