RxJava之Schedulers

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()

翻译自:RxJava — Schedulers — What, when and how to use it?)

你可能感兴趣的:(RxJava之Schedulers)