1、Schedulers调度器
Schedulers将用简单的方式创建多线程。对于android移动端来说,做耗时操作只能在子线程中,返回结果后刷新UI又得切换到主线程中。很多时候我们需要new Thread(),然后用Handler进行请求后的回调,或者借助Asynctask类。这样代码在一个类中这样写可能不多,但对于android来说,每个界面几乎都要请求网络,刷新UI。因此这样的工作一来增加的代码量,不容易维护。二来面对复杂的业务需求的时候,不容易修改和实现。
Scheduler为rxjava添加多线程调度的功能,可以指定操作符在某个调度器(Scheduler)上运行。
Rxjava提供了5种调度器:
- io()
- computation()
- immediate()
- newThread()
- trampoline()
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());
}
});
}