对Rxjava的理解以及结合Retrofit使用(一)

Rxjava说到根上,是处理异步操作的一个库。先看一下在github上对它的介绍:a library for composing asynchronous and event-based programs using observable sequences for the Java VM”(一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库)。
Rxjava的好处在于让代码更加简洁,更加注重代码的逻辑的连贯性。
Rxjava的观察模式

Rxjava有四个基本概念:Observable(可观察者,即被观察者)、Observer(观察者)、Subscribe(订阅)、
回调事件。Observer通过subscribe()方法实现订阅关系,同时触发回调事件。

基本实现

1.创建观察者 第一种方式

Observer即观察者,它决定事件触发的时候该有什么样的行为。
对Rxjava的理解以及结合Retrofit使用(一)_第1张图片

Rxjava的回调事件除了一个普通的onNext()事件之外,还定义了两个特殊事件。onComplete()和onError()。
onNext():基本的回调事件。相当于按钮触发事件中的onClick()方法。
onComplete():事件队列完结。当没有onNext()事件发出时,会触发该方法作为标志。
onError():事件队列异常,在事件处理过程中出现异常时,onError方法会被触发,同时事件队列停止。
注意:在一个正确运行的事件序列中,onComplete()和onError()有且只有一个,在事件序列中作为最后一个被调用。
onComplete()和onError()二者是互斥,即在队列中调用了一个就不能再调用另一个。

创建观察者 第二方式

除了Observer接口,Rxjava还内置了一个实现Observer的抽象类:Subscriber。
对Rxjava的理解以及结合Retrofit使用(一)_第2张图片
两者的基本使用方式一样,实质上,在Rxjava的subScribe过程中,Observer先被转换成一个Subscribe再使用。

区别:
对Rxjava的理解以及结合Retrofit使用(一)_第3张图片
onStart(): 这是 Subscriber 增加的方法。它会在 subscribe 刚开始,而事件还未发送之前被调用,可以用于做一些准备工作,例如数据的清零或重置。这是一个可选方法,默认情况下它的实现为空。需要注意的是,如果对准备工作的线程有要求(例如弹出一个显示进度的对话框,这必须在主线程执行), onStart() 就不适用了,因为它总是在 subscribe 所发生的线程被调用,而不能指定线程。要在指定的线程来做准备工作,可以使用 doOnSubscribe() 方法,具体可以在后面的文中看到。
unsubscribe(): 这是 Subscriber 所实现的另一个接口 Subscription 的方法,用于取消订阅。在这个方法被调用后,Subscriber 将不再接收事件。一般在这个方法调用前,可以使用 isUnsubscribed() 先判断一下状态。 unsubscribe() 这个方法很重要,因为在 subscribe() 之后, Observable 会持有 Subscriber 的引用,这个引用如果不能及时被释放,将有内存泄露的风险。所以最好保持一个原则:要在不再使用的时候尽快在合适的地方(例如 onPause() onStop() 等方法中)调用unsubscribe() 来解除引用关系,以避免内存泄露的发生
Subscriber一旦调用了unSubscribe方法,就没有用了。且当事件传递到了onError()或者onCompleted()方法之后,也会自动解绑。因此导致每次发送请求都要创建一个Subscriber对象。Observer本身是一个接口,不具备解绑的方法,也不具备onStart()方法。没有解绑,可能会导致内存溢出问题。所以最好保持一个原则:要在不再使用的时候尽快在合适的地方(例如 onPause() onStop() 等方法中)调用unsubscribe() 来解除引用关系,以避免内存泄露的发生。
2.创建被观察者Observable

Observable即被观察者,它决定触发事件所带的参数类型。Rxjava使用create()方法创建一个Observable,并传入一个OnSubscribe对象作为参数。OnSubscribe会被存储在Observer对象中,作用相当于一个计划表。当Observable被订阅的时候,
OnSubscribe的call()方法会自动被调用。事件序列就会按照设定依次触发以下代码(如下例所示,将会被调用三次onNext()和一次Oncomplete())。
对Rxjava的理解以及结合Retrofit使用(一)_第4张图片
对Rxjava的理解以及结合Retrofit使用(一)_第5张图片

3.订阅Subsribe

用Subscribe()方法
这里写图片描述
对Rxjava的理解以及结合Retrofit使用(一)_第6张图片

可以看到,subscriber() 做了3件事:

调用 Subscriber.onStart() 。这个方法是Subscriber拥有的。该方法是在事件发送前执行,用来做一些数据的准备工作。
调用 Observable 中的 OnSubscribe.call(Subscriber) 。在这里,事件发送的逻辑开始运行。从这也可以看出,在 RxJava 中, Observable 并不是在创建的时候就立即开始发送事件,而是在它被订阅的时候,即当 subscribe() 方法执行的时候。
将传入的 Subscriber 作为 Subscription 返回。这是为了方便 unsubscribe().
除了 subscribe(Observer) 和 subscribe(Subscriber) ,subscribe() 还支持不完整定义的回调,RxJava 会自动根据定义创建出Subscriber 。形式如下:
对Rxjava的理解以及结合Retrofit使用(一)_第7张图片

你可能感兴趣的:(对Rxjava的理解以及结合Retrofit使用(一))