2、当调用链上有多个subscribeOn时,只有第一个生效:
上面第二个subscribeOn没有实际意义。
observeOn
observeOn用来决定在哪个线程上响应:
1、observeOn决定调用链上下游操作符执行的线程。
上面绿线部分的代码将会运行在主线程。
2、与subscribeOn不同,调用链上允许存在多个observeOn且每个都有效。
上面蓝色绿色部分因为observeOn的存在分别切换到了不同线程执行。
just
RxJava的初学者经常会犯的一个错误是在Observable.just(…)里做耗时任务。just并不是接受lambda,所以是立即执行的,不受subscribeOn的影响。
如上,loadDataSync()不会在io执行。
想要在io执行,需要使用Observable.deffer{}。
flatMap
结合上面介绍的RxJava的线程切换,看下面这段代码。
如果我们希望loadData(id)并发执行,那么上面的写法是错误的。
subscribe(io())意味着其上游的数据在单一线程中串行发射。因此虽然flatMap{}返回多个Observable, 都是都在单一线程中订阅,多个loadData始终运行在同一线程。
代码经过一下修改后,可以达到并发执行的效果:
当订阅flatMap返回的Observable时,通过subscribeOn分别指定订阅线程。
其他类似flatMap这种涉及多个Observable订阅的操作符(例如merge、zip等