RxJava系列教程:
RxJava系列教程之介绍篇(一)
RxJava系列教程之创建篇(二)
RxJava系列教程之变换篇(三)
RxJava系列教程之过滤篇(四)
RxJava系列教程之线程篇(五)
序言
本章我们将讲解rxjava的线程调度相关的东西,为什么会引入线程这个东西呢,必须的啊,总不能把所有操作都放在主线程吧,再说,Google那边的人也不干啊,像什么耗时操作,还是丢在子线程好,像什么计算之类的操作,就丢在专门计算的线程中,这样既减少了错误,有提高了效率,多好啊,那么就让我们来看看rxjava给我们提供了哪些线程方面的服务吧。
线程调度
我们都知道,rxjava主要有2个东西,一个是observable,一个是observer。如果我们在observable那部分使用了耗时操作,比如通过网络下载一张图片,然后我们又在observer里面把得到的图片给一个imageview。所以我们就需要把observable放在子线程中执行,把observer放在主线程中执行。
那么我们要怎么告诉rxjava呢?rxjava提供了相关的api,而且使用方式非常简单,我们先来看看这2个api是什么样的。
subscribeOn(Scheduler scheduler) ——指定observable执行的线程
observeOn(Scheduler scheduler) ——指定observer执行的线程
使用方式很简单,在订阅前调用就行了,那么我们来看看这里面的参数,这个Scheduler其实提供了5种线程,分别是:
Schedulers.immediate(); ——默认线程,当前线程
Schedulers.io(); ——io线程
Schedulers.computation(); ——计算专用线程
Schedulers.newThread(); ——新建一个线程
Schedulers.trampoline(); ——线性处理事件
详细描述:
Schedulers.immediate():这个调度器表示为当前线程,也是rxjava默认的线程
Schedulers.io():这个调度器适用于IO操作,它基于根据需要,增长或缩减来自适应的线程池。
Schedulers.computation():专门用来计算的线程,涉及到CPU计算
Schedulers.newThread():每次使用的时候总会启动一个新线程
Schedulers.trampoline():当我们想在当前线程执行一个任务时,并不是立即,我们可以用.trampoline()将它入队。这个调度器将会处理它的队列并且按序运行队列中每一个任务。
其实RXAndroid还提供了一个线程,为了方便你跳到主线程:
AndroidSchedulers.mainThread() ——android主线程
所以我们使用这个东西,大概就是这个样子:
subscribeOn(Schedulers.newThread())
observeOn(Schedulers.newThread())
是不是很简单?
Log.e(TAG, "所在线程(主线程): " + Thread.currentThread().getName());
Observable
.just(1, 2, 3)
.map(new Func1<Integer, String>() {
@Override
public String call(Integer integer) {
Log.e(TAG, "call1: 所在线程:" + Thread.currentThread().getName());
return "数字:" + integer;
}
})
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<String>() {
@Override
public void call(String s) {
Log.e(TAG, "call2:结果:" + s + ", 所在线程:" + Thread.currentThread().getName());
}
});
运行结果:
所在线程(主线程): main
call1: 所在线程:RxNewThreadSched
call1: 所在线程:RxNewThreadSched
call1: 所在线程:RxNewThreadSched
call2:结果:数字:1, 所在线程:main
call2:结果:数字:2, 所在线程:main
call2:结果:数字:3, 所在线程:main
这就很舒服,我们看到,observable里面的代码在一个新的线程中执行了,而observer还在主线程中执行。根据rxjava和rxandroid提供的这些调度器,我们可以随心所欲的控制自己的代码在哪里执行,为开发提供了极大的便利。
总结
指定observable和observer执行的线程:
subscribeOn(Scheduler scheduler) ——指定observable执行的线程
observeOn(Scheduler scheduler) ——指定observer执行的线程
6大调度器:
Schedulers.immediate(); ——默认线程,当前线程
Schedulers.io(); ——io线程
Schedulers.computation(); ——计算专用线程
Schedulers.newThread(); ——新建一个线程
Schedulers.trampoline(); ——线性处理事件
AndroidSchedulers.mainThread() ——android主线程
自此,rxjava系列教程就讲解完毕了,讲的比较浅,没有深入去探讨他的实现原理,这个系列的目的也是先教会初学者如何使用rxjava,接下来就要靠各位去深入挖掘了。