RxJava2.0的使用-1
注:以下仅适用于RxJava2.0
添加依赖
compile 'io.reactivex.rxjava2:rxjava:2.1.0'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
基本概念:
Observable:数据发射源,在观察者模式中称为“被观察者”;
Observer:数据接收源,在观察者模式中称为“观察者”,可接收Observable;
一、简单使用
创建一个Observable
创建一个Observer
Observable与Observer建立连接
查看日志
将上述代码连起来就是RxJava引以为傲的链式操作:
注意:
- 只有Observable与Observer建立连接之后, Observable才会开始发送事件。即调用subscribe() 方法之后才开始发送事件。
- Observable可以发送无限个onNext,Observer也可以接收无限个onNext。
- Observable可以不发送onComplete或onError。
- 当Observable发送了一个onComplete后,onComplete之后的事件将会继续发送;而Observer收到onComplete事件之后将不再继续接收事件。
- 当Observable发送了一个onError后,onError之后的事件将继续发送;而Observer收到onError事件之后将不再继续接收事件。
- onComplete和onError必须唯一且互斥。即不能发多个onComplete; 不能发多个onError,;不能先发一个onComplete, 然后再发一个onError; 反之亦然。发送多个onComplete是可以正常运行的, Observer收到第一个onComplete就不再接收了;但若是发送多个onError,收到第二个onError事件会导致程序会崩溃。这点需要自行在代码中进行控制。
二、Observer(数据接收源)的创建
创建一个数据接收源:
调用顺序:首先会调用onSubscribe方法,这里可以拿到Disposable的实例;然后根据Observable的发射顺序调用onNext()、onComplete()、onError()方法。
Observer:T代表Observer接收的数据类型,与onNext()方法的接收的数据类型一致。
Disposable:表示一次性资源,用来监测取消发射源与接收源的数据连接关系,参数d的实例可以随时调用dispose()方法取消连接。取消连接后,Observable会继续发送剩余的事件,而Observer不再接受事件。例如:Observable依次发送”1”,”2”,”3”,onComplete(),”4”;在Observer在接收到”2”后调用dispose()方法取消连接。
可以看出:刚开始Disposable的取消连接状态为false,即在连接状态;接收到”2”后调用dispose(),此时取消连接状态为true,即在未连接状态,此后Observer便不再接收事件。但Observable会继续发送”3”,onComplete(),”4”事件。
三、subscribe的重载方法
public final Disposable subscribe() {}
public final Disposable subscribe(Consumer<? super T> onNext) {}
public final Disposable subscribe(Consumer<? super T> onNext, Consumer<? super Throwable> onError) {}
public final Disposable subscribe(Consumer<? super T> onNext, Consumer<? super Throwable> onError, Action onComplete) {}
public final Disposable subscribe(Consumer<? super T> onNext, Consumer<? super Throwable> onError, Action onComplete, Consumer<? super Disposable> onSubscribe) {}
public final void subscribe(Observer<? super T> observer) {}
3.1 参数为Observer < T > 的subscribe方法
这种方法上文已经使用过,这种方法会监听onSubscribe()、onNext()、onComplete()、onError()事件。
3.2 不带参数的subscribe方法
这种方法可以理解为没有给数据发射源绑定数据接收源,即Observable调用onSubscribe()后开始发送事件,但是没有接收事件的对象。
3.3 带参数的subscribe方法
这种方法表示只有某些事件的回调,例如只有onNext()事件的回调。
由Log可以看出,当Observable调用了onComplete()方法后,Observer依旧会停止接收onComplete()之后的事件。由此可以看出,虽然这种带参数的subscribe方法只有某些方法的回调,但是接收事件的逻辑不会改变,只是缺少了没有回调事件的响应能力。
其他带参数的subscribe方法类似,此处就不一一说明了。
四、Observable的创建方式
4.1 create()方式
ObservableEmitter:安全发射器,不能为空。可以发送三种类型的事件,分别为:onNext(T value)、onComplete()和onError(Throwable error)。
4.2 new 方式
4.3 just()方式
这种方式将创建一个Observable并自动调用onNext( )发射数据,发射完所填数据后自动调用onComplete()方法。just方法支持填入的数据类型为T,不能为空,支持数据个数为1~10。
4.4 from系列()方式
这种方式是将一个序列转化为一个ObservableSource,发射这个序列里的每个item。
例子描述:Array
例子描述:List
4.5 defer( )方式
这种方式有观察者订阅时才创建Observable,并且为每个观察者创建一个新的Observable,执行Call()方法。
4.6 interval( )方式
创建一个以指定延迟时间、按固定时间间隔发射序列的Observable。
public static Observable<Long> interval(long initialDelay, long period, TimeUnit unit) {}
- initialDelay:延迟时间
- period:循环周期
- unit:时间间隔周期
例子描述:创建一个延迟为两个时间单位、周期为一个时间单位、时间单位是秒的Observable。
由Log可以看出Observable确实是以延迟2秒、时间间隔为1秒发射了一个起始值为0的自然数序列。需要注意的是Observer需要调用dispose()断开连接,否则Observer会一直接收数据。
4.7 rangeLong()方式
创建一个以指定起始值、指定个数的发射序列的Observable。
public static Observable<Long> rangeLong(long start, long count) {}
- start:起始值
- count:个数。若为0,不发送;若为负数,抛异常。
例子描述:创建一个以起始值为2,个数为5的Observable。即发送2、3、4、5、6。
由Log可以看出Observable发射事件时没有时间间隔和延迟。
4.8 timer()方式
创建一个在指定时间单位后发射特殊值的Observable。
public static Observable<Long> timer(long delay, TimeUnit unit) {}
例子描述:创建一个以2个时间单位为延迟,时间单位为秒的Observable。
4.9 Observable的其他方法
4.9.1 设置循环次数
使用repeat()方法设置循环次数
4.9.2 设置延时
使用delay()设置延时