RxJava(二:Observable 创建,组合与过滤)

2.Observable 创建,组合与过滤

本节一共分三个重点:
①Observable的创建:我们将介绍如何创建Observable、Observable的生命周期,以及RxJava如何异步执行的基础知识。
②Composition: 我们将说明不同的Observable是如何组合在一起的。这是RxJava事件驱动模型的核心,支持我们的事件处理程序的延迟执行。
③过滤:我们将讨论如何在我们的复合Observable中包含过滤器操作,以删除不需要的数据,以及一些在繁忙的系统中非常有用的基于时间的操作。

2.1 Observable的创建——生命周期

这里写图片描述

当我们想要从一个Observable中获取信息时,我们会实现一个观察者接口,然后在我们希望订阅的Observable上调用subscribe方法。
在Observer接口上有三个方法:
    ①onNext:每当 一个新的事件被发布到该观察者所绑定到的Observable上时候,就会调用。这是在每个事件上执行一些操作的方法。您可以猜到,这是我们最有趣的代码所在的方法。
    ②OnCompleted:与一个Observable的相关联的一系列事件完成的时候调用的方法,同时也表明你不应该再期待你的Observer的会再次调用onNext,因为已经完成结束了。
    ③OnError:当在RxJava框架代码或事件处理代码中抛出未处理的异常时调用该方法。一旦onError被调用,就不再需要onNext或onCompleted调用了。
我们讨论的另一个有趣的接口是Subscription接口。Observable的subscribe 方法的返回值是一个Subscription接口对象。Subscription 有一个名为unsubscribe的方法。该方法可以将观察者从Observable所订阅的观察者中断开连接。

2.2 Observable创建——类型化

这里写图片描述

接下来我们来讨论在RxJava中Observables所支持的两种不同的类型。
首先,是正常的非阻塞的Observable,由超类Observable表示。对于这种类型的Observable, 支持异步执行;这意味着我们可以请求通过不同的线程处理事件。另外,非阻塞的可观察性允许您在事件流中的任何一点上取消订阅。作为一个重要的说明,RxJava默认是单线程的。这一点很重要。异步执行增加了额外的复杂度,您不应该轻视。如果希望利用异步执行行为,则必须要求Observables在不同线程上执行。此外,如果您想要并行(parallel)执行行为,而不仅仅是在UI线程之外的线程上的事件,例如,你必须经过额外的设置。我们将在随后的演示中讨论这个问题。
第二种Observable类型的是阻塞类型的Observable。它是BlockingObservable类的实现类。这个类是基本Observable的子类。所有的观察者从BlockingObservable上调用的onNext都讲师同步阻塞的。这意味着它们不会在不同的线程上执行。如果您看一下BlockingObservable的Javadoc,您会注意到它的方法都没有使用调度器(Scheduler)对象,指示所有执行都将发生在调用了对BlockingObservable的操作的线程上。对于BlockingObservables, 在事件流的中间取消订阅是不允许的。
在使用RxJava编程时,不同的Observables行为是需要注意的一个重要细节,您应该密切关注Javadoc中记录的获取Observable的方法,有的方法已经备注了其返回值是BlockingObservables。所以要根据你实际返回的Observable类型,知道是否支持异步,是否可以在事件流中取消订阅等特性。

2.3 Observable创建——调度器

RxJava允许您指定代码将通过使用调度器执行的线程。schedulers类提供了几个预填充选项。这些包括
①computation(计算):这是一个调度程序,它将有许多可用的线程,线程数等于计算机中CPU核心的数量。顾名思义,这个调度器对计算工作很有用。
②CurrentThread/immediate: CurrentThread调度器表示当当前工作完成后,您希望事件代码在当前线程中运行。这与immediate调度器的情况相反,后者不允许当前的工作完成,而是立即在当前线程中调用您的处理程序代码。
③I/O scheduler:这个调度器被长期运行的I/O进程使用,比如网络通信或与数据库对话。它由一个线程池支持,线程池将在需要时增长,以支持大量的等待I/O线程。
④NewThread:此调度器指示您需要为每个工作单元创建一个新线程。
⑤Executor:这个调度器是通过from(Executor executor)方法用RxJava的ExecutorScheduler来包装一个标准的Java Executor接口。
⑥trampoline:将Executor实例封装起来并在其上建立调度程序契约的调度程序.注意,由于我们不知道v的底层线程行为,所以线程跳转是不可避免的。

让我们讨论一个重要的细节,围绕Observable与schedulers(调度器)的杠杆作用。在这个话题中,我们还会讲到更多,但是有一个非常核心的重点-----需要注意的是,RxJava默认是单线程的。如果您没有改变代码运行的方式,那么您的subscribe调用和所有的observer(观察者)的事件调用将在调用subscribe方法的相同线程上执行。RxJava将您的代码放到一个事件驱动的形状中,并使得在不同的调度程序上执行代码变得很容易.
然而,不应该轻率地执行代码并发执行,RxJava将调度器指令的分配留给您。在Observable类上有两个有用的方法可以影响在执行期间如何使用调度程序。首先,是subscribeOn 方法。这个方法允许您传递一个Scheduler(调度器),它决定了调用subscribe方法时代码运行的线程。如果没有指定调度器,则将使用当前线程来派生subscribe调用。如果您不为subscribeOn指定一个Scheduler(调度器),则subscribe方法将阻塞直到所有事件都被处理为相关的Observable。使用subscribeOn分配一个调度器意味着驱动订阅的代码将在从指定的调度器中提取的一个且仅有一个的线程上。
接下来是observeOn方法。此方法决定在onNext、onCompleted和onError调用中使用的调度器。如果您没有在observeOn方法上执行Scheduler(调度器),那么所有的观察者方法都将使用subscribeOn所绑定的Scheduler(调度器)执行调用。同样,如果你也没有为subscribeOn绑定Scheduler(调度器),则表示观察者方法将使用与驱动Observable的subscribe方法调用相同的线程来执行调用(上面以小段就讲的这个)。还要注意,使用observeOn分配调度程序意味着您的观察者代码将被从Scheduler(调度器)中获取的一个,并且只能是一个的线程中执行调用。对观察者的调用并不是并行的。我们将在接下来的章节中详细讨论这个细节。

2.4 Observable的创建 - The Act of Creation

最简单的方法是使用Observable.from的重载方法。

猜你喜欢

转载自blog.csdn.net/qq_31179577/article/details/78775967