RxJava系列教程之线程篇(五)

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,接下来就要靠各位去深入挖掘了。

猜你喜欢

转载自blog.csdn.net/it_xf/article/details/74986116