以下面代码为例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Observable.just("HELLO WORLD")
.map(new Function<String, String>() {
@Override
public String apply(@NonNull String s) throws Exception {
s = s.toLowerCase();
return s;
}
})
.subscribeOn(Schedulers.computation())
.map(new Function<String, String>() {
@Override
public String apply(String s) throws Exception {
s = s + "map";
return s;
}
})
.observeOn(Schedulers.newThread())
.subscribe(new Consumer<String>() {
@Override
public void accept(@NonNull String s) throws Exception {
System.out.println(s);
}
});

简单分析一下代码执行流程

  1. 从上到下,建立上下依赖关系,初始化线程
  2. .subscribe为调用起点,自下向上开始准备调用,这个过程subscribeOn起作用,observeOn不起切换线程作用。
  3. 从上到下执行,类似map中的代码,这时候observeOn起切换线程作用。

调用流程简化如下:
屏幕快照 2017-09-05 下午4.18.45.png-163.6kB

涉及的相关类:
屏幕快照 2017-09-05 下午4.26.43.png-100kB

这也是为什么subscribeOn只有第一次起作用,observeOn每次都起作用。