Rxjava的线程调度

Author Avatar
w4ctech 3月18日
  • 在其它设备中阅读本文章

最后更新于2019年03月21日; 如遇到问题,请留言及时通知站长

调度器

用于线程调度

使用案例

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():只执行一次,指定事件的接收者所运行在的线程。叫做事件消费的线程

本文链接:https://www.w4ctech.cn/Rxjava/thread.html
This blog is under a CC BY-NC-SA 3.0 Unported License