Schedulers是RxJava的主要组件之一。负责在不同线程上执行Observables的操作,便于将耗时任务分摊到其他线程。本文将会学习调度器的类型和使用场景。
IO
最常见的调度器之一。用于IO相关操作。比如网络请求和文件操作。IO 调度器背后由线程池支撑。
它首先创建一个工作线程,可以复用于其他操作。当然,当这个工作线程(长时间任务的情况)不能被复用时,会创建一个新的线程来处理其他操作。这个好处也会带来一些问题,因为它允许创建的线程是无限的,所以当创建大量线程的时候,会对整体性能造成一些影响。不过IO调度器仍然不失为一个好用的调度器。使用如下:
observable.subscribeOn(Schedulers.io())
Computation
这个调度器和IO调度器非常相似,因其也是由线程池支持的。然鹅,其可用的线程数是固定的,和系统的cpu核数目保持一致。所以如果你的手机是双核的,那么线程池中就有两个线程。这也意味着如果这两条线程都处于忙碌状态,那么该进程将会等待线程变成空闲状态的时候才能处理其他操作。因为这个限制,它不太适合IO相关操作。适用于进行一些计算操作,计算速度还很快。使用如下:
observable.subscribeOn(Schedulers.newThread())
Single
此款调度器非常简单,由一个线程支持。所以无论有多少个observables,都将只运行在这个线程上。也可将其认为是主线程的一个替代,使用如下:
observable.subscribeOn(Schedulers.single())
Immediate
此款调度器在当前活跃线程以阻塞的方式开始其任务(rxjava2已将其移除),无视当前运行的任务。使用如下:
observable.subscribeOn(Schedulers.immediate())
Trampoline
此款调度器运行在当前线程,所以如果你有代码运行在主线程上,它会将将要运行的代码块添加到主线程的队列。和Immediate非常相似,不同的是Immediate会阻塞此线程,而Trampoline会等待当前任务执行完成。适用用于不止一个observables,并且希望它们能够按照顺序执行的场景。
Observable.just(1,2,3,4)
.subscribeOn(Schedulers.trampoline())
.subscribe(onNext);
Observable.just( 5,6, 7,8, 9)
.subscribeOn(Schedulers.trampoline())
.subscribe(onNext);
Output:
Number = 1
Number = 2
Number = 3
Number = 4
Number = 5
Number = 6
Number = 7
Number = 8
Number = 9
使用如下:
observable.subscribeOn(Schedulers.trampoline())
Executor Scheduler
更像是一种自定义的IO调度器。我们可以通过制定线程池的大小来创建一个自定义的线程池。适用于observables的数量对于IO调度器太多的场景使用,使用如下:
val executor = Executors.newFixedThreadPool(10)
val pooledScheduler = Schedulers.from(executor)
Android Scheduler
由rxAndroid库提供,用于将操作切换到主线程以便操作ui,经常用于observeOn方法。使用如下:
AndroidSchedulers.mainThread()