作用
让操作符(或者特定的Observable)在指定的调度器(Scheduler)上运行,就可以在链式调用中实现多线程任务。
有些Observable的操作符会接收一个Scheduler(调度器)参数,这个参数会将操作符的部分或者全部任务放在指定的调度器上执行。
默认情况下,Observable和Operators调用链上的任务,还有通知Observer的工作都会在subscribe方法调用的线程进行。SubscribeOn操作符会指定Observable在哪个调度器上执行。ObserveOn操作符会告诉Observable在哪个调度器上通知Observer。
如下图所示:subscribeOn(蓝色)指定了Observable工作在蓝色调度器上。observeOn(橙色)指定了调用链后续任务在橙色调度器上执行,而且可以手动再次切换(粉**紫色**)。
调度器的种类
注释:can kaoRxJava2,版本号2.2.19。
调度器类型 | 效果 |
---|---|
Schedulers.computation( ) | 用于计算任务,如事件循环或和回调处理。不要用于IO操作(IO操作请使用Schedulers.io());默认线程数等于处理器的数量。 |
Schedulers.from(executor) | 使用指定的Executor作为调度器 |
Schedulers.io( ) | 用于IO密集型任务,如异步阻塞IO操作,这个调度器的线程池会根据需要增长;对于普通的计算任务,请使用Schedulers.computation();Schedulers.io( )默认是一个CachedThreadScheduler,很像一个有线程缓存的新线程调度器. |
Schedulers.newThread( ) | 为每个任务创建一个新线程。 |
Schedulers.trampoline( ) | 当其它排队的任务完成后,在当前线程排队开始执行。 |
Schedulers.single() | 共享的单个线程。 |
调度器的使用
除了用在Observable和操作符上,我们也可以独立使用Scheduler。用法如下:
Scheduler.Worker worker = Schedulers.newThread().createWorker();
worker.schedule(new Runnable() {
@Override
public void run() {
//TODO
}
});
//TODO
worker.dispose();
还可以延时调度
Scheduler.Worker worker = Schedulers.newThread().createWorker();
worker.schedule(new Runnable() {
@Override
public void run() {
//TODO
}
},100,TimeUnit.SECONDS);
//TODO
worker.dispose();
再加上周期性的执行
Scheduler.Worker worker = Schedulers.newThread().createWorker();
worker.schedulePeriodically(new Runnable() {
@Override
public void run() {
//TODO
}
},10,100,TimeUnit.SECONDS);
//TODO
worker.dispose();