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()
作者:塞上牧羊空许约
链接:https://www.jianshu.com/p/6637724b094f
共同学习,写下你的评论
评论加载中...
作者其他优质文章