用于线程调度
Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
System.out.println("正在进行耗时操作");
subscriber.onNext("执行耗时操作后的结果");
subscriber.onCompleted();
}
})
.subscribeOn(Schedulers.io()) //让被观察者执行在IO线程
.observeOn(AndroidSchedulers.mainThread()) //让观察者执行在主线程
.subscribe(...);
Schedulers.immediate(): 直接在当前线程运行,相当于不指定线程。这是默认的 Scheduler
Schedulers.newThread(): 总是启用新线程,并在新线程执行操作
Schedulers.io(): I/O 操作(读写文件、读写数据库、网络信息交互等)所使用的 Scheduler。行为模式和 newThread() 差不多,区别在于 io() 的内部实现是是用一个无数量上限的线程池,可以重用空闲的线程,因此多数情况下 io() 比 newThread() 更有效率。不要把计算工作放在 io() 中,可以避免创建不必要的线程
Schedulers.computation(): 计算所使用的 Scheduler。这个计算指的是 CPU 密集型计算,即不会被 I/O 等操作限制性能的操作,例如图形的计算。这个 Scheduler 使用的固定的线程池,大小为 CPU 核数。不要把 I/O 操作放在 computation() 中,否则 I/O 操作的等待时间会浪费 CPU
AndroidSchedulers.mainThread(): 它指定的操作将在 Android 主线程运行
有了这几个Scheduler,就可以使用 subscribeOn() 和 observeOn() 两个方法来对线程进行控制了。observeOn() 执行时的当前 Observable 所对应的 Subscriber ,即它的直接下级 Subscriber 。换句话说,observeOn() 指定的是它之后的操作所在的线程。因此如果有多次切换线程的需求,只要在每个想要切换线程的位置调用一次 observeOn() 即可。 observeOn() 的多次调用,程序实现了线程的多次切换。不过,不同于 observeOn() , subscribeOn() 的位置放在哪里都可以,但它是只能调用一次
subscribeOn():可执行多次,指定事件源或操作符执行的线程,叫做事件产生的线程。代码一般放在之前,除了事件源
observeOn():只执行一次,指定事件的接收者所运行在的线程。叫做事件消费的线程