1、Schedulers调度器

Schedulers将用简单的方式创建多线程。对于android移动端来说,做耗时操作只能在子线程中,返回结果后刷新UI又得切换到主线程中。很多时候我们需要new Thread(),然后用Handler进行请求后的回调,或者借助Asynctask类。这样代码在一个类中这样写可能不多,但对于android来说,每个界面几乎都要请求网络,刷新UI。因此这样的工作一来增加的代码量,不容易维护。二来面对复杂的业务需求的时候,不容易修改和实现。

Scheduler为rxjava添加多线程调度的功能,可以指定操作符在某个调度器(Scheduler)上运行。

Rxjava提供了5种调度器:

  1. io()
  2. computation()
  3. immediate()
  4. newThread()
  5. trampoline()

rxjava 解决回调的问题_UI

1、Schedulers.i0()

主要用于一些耗时操作,比如读写文件,数据库存取,网络交互等。
这个调度器根据需要,增加或者减少线程池中的线程数量。需要注意的是Schedulers.i0()中的线程池数量是无限制大的,大量的I/0操作将创建许多线程,我们需要在性能和线程数量中做出取舍。

2、Schedulers.computation()

计算所使用的 Scheduler。这个计算指的是 CPU 密集型计算,即不会被 I/O 等操作限制性能的操作,例如图形的计算。这个 Scheduler 使用的固定的线程池,大小为 CPU 核数。不要把 I/O 操作放在 computation() 中,否则 I/O 操作的等待时间会浪费 CPU。

3、Schedulers.immediate()

默认的,直接在当前线程运行。

4、Schedulers.newThread()

开启一个新的线程

5、Schedulers.trampoline()

当我们想在当前线程执行一个任务时,并不是立即执行,用trampoline()将它加入队列。这个调度器将会处理它的队列并且按程序运行队列中每一个任务。

6、AndroidSchedulers.mainThread()

Android中专用的,指定的操作在Android的主线程(UI线程中)运行。

2、SubscribeOn和ObserverOn

SubscribeOn

指定Observable自身在哪个调度器上执行,可以使用SubscribeOn操作符指定Observable在一个特定的调度器上运行。

ObserveOn

指定Observable应该在哪个调度器上调用观察者的onNext, onCompleted, onError方法,你需要使用ObserveOn

也就是说:
subscribeOn()主要改变的是订阅的线程,即call()执行的线程;
observeOn()主要改变的是发送的线程,即onNext, onCompleted, onError执行的线程。

仍物线总结:

1、只有第一subscribeOn() 起作用(所以多个 subscribeOn() 毛意义)
2、 subscribeOn() 控制从流程开始的第一个操作,直到遇到第一个 observeOn()
3、observeOn() 可以使用多次,每个 observeOn() 将导致一次线程切换(),这次切换开始于这次 observeOn() 的下一个操作
4、不论是 subscribeOn() 还是 observeOn(),每次线程切换如果不受到下一个 observeOn() 的干预,线程将不再改变,不会自动切换到其他线程

3、示例

示例1

Observable
.map                    // 操作1
.flatMap                // 操作2
.subscribeOn(io)
.map                    //操作3
.flatMap                //操作4
.observeOn(main)
.map                    //操作5
.flatMap                //操作6
.subscribeOn(io)        //!!特别注意
.subscribe(handleData)

操作1,操作2是在io线程上,因为之后subscribeOn切换了线程
操作3,操作4也是在io线程上,因为在subscribeOn切换了线程之后,并没有发生改变。
操作5,操作6是在main线程上,因为在他们之前的observeOn切换了线程。
特别注意那一段,对于操作5和操作6是无效的

示例2

下面一个网络请求,请求在io线程中,请求后返回数据后的回调在主线程中,可以刷新UI。

subscription = com.example.rxjava.Network.getNewFunApi().getNewTop("1", "10")
                .subscribeOn(Schedulers.io())//指定subscriber在I/0线程中执行
                .observeOn(AndroidSchedulers.mainThread())//在主线程中执行
                .subscribe(new Observer<NewTop>() {
                    @Override
                    public void onCompleted() {
                        //swiperefresh.setRefreshing(false);
                        Log.i("--rxjava--", "onCompleted");

                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.i("--rxjava--e", e.toString());

                    }

                    @Override
                    public void onNext(NewTop d) {
                        Log.i("--date", d.getData().toString());
                    }
                });
    }