1. 创建操作符
名称 | 有什么用 | 怎么用 |
create() | 创建一个被观察者 | Observable<String> observable = Observable.create(new ObservableOnSubscribe<String>() { @Override public void subscribe(ObservableEmitter<String> e) throws Exception { e.onNext("Hello Observer"); e.onComplete(); } }); |
just() | 创建一个被观察者,并发送事件,发送的事件不可以超过10个以上。 | Observable.just(1, 2, 3) .subscribe(new Observer < Integer > () { ...................... }); |
formFuture() | 参数中的 Future 是 java.util.concurrent 中的 Future,Future 的作用是增加了 cancel() 等方法操作 Callable,它可以通过 get() 方法来获取 Callable 返回的值。 | FutureTask < String > futureTask = new FutureTask < > (new Callable < String > () { @Override public String call() throws Exception { Log.d(TAG, "CallableDemo is Running"); return "返回结果"; } }); Observable.fromFuture(futureTask) .doOnSubscribe(new Consumer < Disposable > () { @Override public void accept(Disposable disposable) throws Exception { futureTask.run(); } }) .subscribe(new Consumer < String > () { @Override public void accept(String s) throws Exception { Log.d(TAG, "================accept " + s); } }); |
formIterable() | 直接发送一个 List 集合数据给观察者 | List<Integer> list = new ArrayList<>(); list.add(0); list.add(1); list.add(2); list.add(3); Observable.fromIterable(list) .subscribe(new Observer < Integer > () { ................. }); |
formFuture() | 参数中的 Future 是 java.util.concurrent 中的 Future,Future 的作用是增加了 cancel() 等方法操作 Callable,它可以通过 get() 方法来获取 Callable 返回的值。 | FutureTask < String > futureTask = new FutureTask < > (new Callable < String > () { @Override public String call() throws Exception { Log.d(TAG, "CallableDemo is Running"); return "返回结果"; } }); Observable.fromFuture(futureTask) .doOnSubscribe(new Consumer < Disposable > () { @Override public void accept(Disposable disposable) throws Exception { futureTask.run(); } }) .subscribe(new Consumer < String > () { @Override public void accept(String s) throws Exception { Log.d(TAG, "================accept " + s); } }); |
formIterable() | 直接发送一个 List 集合数据给观察者 | List<Integer> list = new ArrayList<>(); list.add(0); list.add(1); list.add(2); list.add(3); Observable.fromIterable(list) .subscribe(new Observer < Integer > () { ................. }); |
defer() | 这个方法的作用就是直到被观察者被订阅后才会创建被观察者。 | // i 要定义为成员变量 Integer i = 100; Observable<Integer> observable = Observable.defer(new Callable<ObservableSource<? extends Integer>>() { @Override public ObservableSource<? extends Integer> call() throws Exception { return Observable.just(i); } }); i = 200; Observer observer = new Observer<Integer>() { @Override public void onSubscribe(Disposable d) { } @Override public void onNext(Integer integer) { Log.d(TAG, "================onNext " + integer); } @Override public void onError(Throwable e) { } @Override public void onComplete() { } }; observable.subscribe(observer); i = 300; observable.subscribe(observer); ----------------------------------------结果-------------------------------------------- 05-20 20:05:01.443 26622-26622/? D/chan: ================onNext 200 ================onNext 300 因为 defer() 只有观察者订阅的时候才会创建新的被观察者,所以每订阅一次就会打印一次,并且都是打印 i 最新的值。 |
timer() | 当到指定时间后就会发送一个 0L 的值给观察者。 | Observable.timer(2, TimeUnit.SECONDS) .subscribe(new Observer < Long > () { ................................. }); |
interval() | 每隔一段时间就会发送一个事件,这个事件是从0开始,不断增1的数字。 | Observable.interval(4, TimeUnit.SECONDS) .subscribe(new Observer < Long > () { ...................... }); |
intervalRange() | 可以指定发送事件的开始值和数量,其他与 interval() 的功能一样。 | // 从2,传入5个数,初始延迟2s,onNext延迟1s Observable.intervalRange(2, 5, 2, 1, TimeUnit.SECONDS) .subscribe(new Observer < Long > () { ........................... }); |
range() | 同时发送一定范围的事件序列。 | 从2到5 Observable.range(2, 5) .subscribe(new Observer < Integer > () { ................................. }); |
rangeLong() | 同时发送一定范围的事件序列。 | 用法与 range() 一样 |
empty() never() error() | 1. empty() : 直接发送 onComplete() 事件 2. never():不发送任何事件 3. error():发送 onError() 事件 | Observable.empty() .subscribe(new Observer < Object > () { ............................. }); 打印结果: ==================onSubscribe ==================onComplete 复制代码 换成 never() 的打印结果: ==================onSubscribe 复制代码 换成 error() 的打印结果: ==================onSubscribe ==================onError java.lang.NullPointerException |
2. 转换操作符
名称 | 有什么用 | 怎么用 |
map() | map 可以将被观察者发送的数据类型转变成其他的类型 | Observable.just(1, 2, 3) .map(new Function < Integer, String > () { @Override public String apply(Integer integer) throws Exception { return "I'm " + integer; } }) .subscribe(new Observer < String > () { ............................................ }); |
flatMap() | 这个方法可以将事件序列中的元素进行整合加工,返回一个新的被观察者。 | flatMap() 其实与 map() 类似,但是 flatMap() 返回的是一个 Observerable ....................... |
同时发送一定范围的事件序列。 | 用法与 range() 一样 | |
concatMap() | oncatMap() 和 flatMap() 基本上是一样的,只不过 concatMap() 转发出来的事件是有序的,而 flatMap() 是无序的。 | ............................. |
同时发送一定范围的事件序列。 | 用法与 range() 一样 | |
buffer() | 从需要发送的事件当中获取一定数量的事件,并将这些事件放到缓冲区当中一并发出。 | buffer 有两个参数,一个是 count,另一个 skip。count 缓冲区元素的数量,skip 就代表缓冲区满了之后,发送下一次事件序列的时候要跳过多少元素。这样说可能还是有点抽象,直接看代码: Observable.just(1, 2, 3, 4, 5) .buffer(2, 1) .subscribe(new Observer < List < Integer >> () { ................................. @Override public void onNext(List < Integer > integers) { Log.d(TAG, "================缓冲区大小: " + integers.size()); for (Integer i: integers) { Log.d(TAG, "================元素: " + i); } } ................................. }); -----------------------------打印结果---------------------------------------- ================缓冲区大小: 2 ================元素: 1 ================元素: 2 ================缓冲区大小: 2 ================元素: 2 ================元素: 3 ================缓冲区大小: 2 ================元素: 3 ================元素: 4 ================缓冲区大小: 2 ================元素: 4 ================元素: 5 ================缓冲区大小: 1 ================元素: 5 从结果可以看出,每次发送事件,指针都会往后移动一个元素再取值,直到指针移动到没有元素的时候就会停止取值。。 |
groupBy() | 将发送的数据进行分组,每个分组都会返回一个被观察者。 | Observable.just(5, 2, 3, 4, 1, 6, 8, 9, 7, 10) .groupBy(new Function < Integer, Integer > () { @Override public Integer apply(Integer integer) throws Exception { return integer % 3; } }) .subscribe(new Observer < GroupedObservable < Integer, Integer >> () { ................................ @Override public void onNext(GroupedObservable < Integer, Integer > integerIntegerGroupedObservable) { ................................ } }); |
scan() | 将数据以一定的逻辑聚合起来。 | bservable.just(1, 2, 3, 4, 5) .scan(new BiFunction < Integer, Integer, Integer > () { @Override public Integer apply(Integer integer, Integer integer2) throws Exception { Log.d(TAG, "====================apply "); Log.d(TAG, "====================integer " + integer); Log.d(TAG, "====================integer2 " + integer2); return integer + integer2; } }) .subscribe(new Consumer < Integer > () { @Override public void accept(Integer integer) throws Exception { Log.d(TAG, "====================accept " + integer); } }); ====================accept 1 ====================apply ====================integer 1 ====================integer2 2 ====================accept 3 ====================apply ====================integer 3 ====================integer2 3 ====================accept 6 ====================apply ====================integer 6 ====================integer2 4 ====================accept 10 ====================apply ====================integer 10 ====================integer2 5 ====================accept 15 |
window() | 发送指定数量的事件时,就将这些事件分为一组。window 中的 count 的参数就是代表指定的数量,例如将 count 指定为2,那么每发2个数据就会将这2个数据分成一组。 | Observable.just(1, 2, 3, 4, 5) .window(2) .subscribe(new Observer < Observable < Integer >> () { ................................ @Override public void onNext(Observable < Integer > integerObservable) { integerObservable.subscribe(new Observer < Integer > () { @Override public void onSubscribe(Disposable d) { Log.d(TAG, "=====================integerObservable onSubscribe "); } @Override public void onNext(Integer integer) { Log.d(TAG, "=====================integerObservable onNext " + integer); } @Override public void onError(Throwable e) { Log.d(TAG, "=====================integerObservable onError "); } @Override public void onComplete() { Log.d(TAG, "=====================integerObservable onComplete "); } }); } ................................ }); ---------------------打印结果---------------------- =====================integerObservable onSubscribe =====================integerObservable onNext 1 =====================integerObservable onNext 2 =====================integerObservable onComplete =====================integerObservable onSubscribe =====================integerObservable onNext 3 =====================integerObservable onNext 4 =====================integerObservable onComplete =====================integerObservable onSubscribe =====================integerObservable onNext 5 =====================integerObservable onComplete |
3. 条件操作符
all() | 判断事件序列是否全部满足某个事件,如果都满足则返回 true,反之则返回 false。 | Observable.just(1, 2, 3, 4) .all(new Predicate < Integer > () { @Override public boolean test(Integer integer) throws Exception { return integer < 5; } } .......................... --------------- 打印结果 -------------- ==================aBoolean true |
takeWhile() | 可以设置条件,当某个数据满足条件时就会发送该数据,反之则不发送。 | Observable.just(1, 2, 3, 4) .takeWhile(new Predicate < Integer > () { @Override public boolean test(Integer integer) throws Exception { return integer < 3; } }) ............................................. --------------- 打印结果 -------------- ========================integer 1 ========================integer 2 |
skipWhile() | 可以设置条件,当某个数据满足条件时不发送该数据,反之则发送。 | Observable.just(1, 2, 3, 4) .skipWhile(new Predicate < Integer > () { @Override public boolean test(Integer integer) throws Exception { return integer < 3; } }) ............................................. --------------- 打印结果 -------------- ========================integer 3 ========================integer 4 |
takeUntil() | 可以设置条件,当事件满足此条件时,下一次的事件就不会被发送了。 | Observable.just(1, 2, 3, 4, 5, 6) .takeUntil(new Predicate < Integer > () { @Override public boolean test(Integer integer) throws Exception { return integer > 3; } }) .................... --------------- 打印结果 -------------- ========================integer 1 ========================integer 2 |
skipUntil() | 当 skipUntil() 中的 Observable 发送事件了,原来的 Observable 才会发送事件给观察者。 | //可以指定发送事件的开始值和数量,其他与 interval() 的功能一样。 Observable.intervalRange(1, 5, 0, 1, TimeUnit.SECONDS) .skipUntil(Observable.intervalRange(6, 5, 3, 1, TimeUnit.SECONDS)) .................................................. --------------- 打印结果 -------------- ========================onSubscribe ========================onNext 4 ========================onNext 5 ========================onComplete skipUntil() 里的 Observable 并不会发送事件给观察者。 |
sequenceEqual() | 判断事件序列中是否含有某个元素,如果有则返回 true,如果没有则返回 false。 | Observable.just(1, 2, 3) .contains(3) .................................. --------------- 打印结果 -------------- ========================onNext true |
isEmpty() | 判断事件序列是否为空。 | Observable.create(new ObservableOnSubscribe < Integer > () { @Override public void subscribe(ObservableEmitter < Integer > e) throws Exception { e.onComplete(); } }) .isEmpty() ................................ --------------- 打印结果 -------------- ===================onNext true |
amb() | amb() 要传入一个 Observable 集合,但是只会发送最先发送事件的 Observable 中的事件,其余 Observable 将会被丢弃。 | ArrayList < Observable < Long >> list = new ArrayList < > (); list.add(Observable.intervalRange(1, 5, 2, 1, TimeUnit.SECONDS)); list.add(Observable.intervalRange(6, 5, 0, 1, TimeUnit.SECONDS)); Observable.amb(list) ................................... --------------- 打印结果 -------------- ========================aLong 6 ========================aLong 7 ========================aLong 8 ========================aLong 9 ========================aLong 10 |
defaultIfEmpty() | 如果观察者只发送一个 onComplete() 事件,则可以利用这个方法发送一个值。 | Observable.create(new ObservableOnSubscribe < Integer > () { @Override public void subscribe(ObservableEmitter < Integer > e) throws Exception { e.onComplete(); } }) .defaultIfEmpty(666) ....................... --------------- 打印结果 -------------- ==================onNext 666 |
4. 组合操作符
名称 | 有什么用 | 怎么用 |
concat() | 可以将多个观察者组合在一起,然后按照之前发送顺序发送事件。需要注意的是,concat() 最多只可以发送4个事件。 | Observable.concat(Observable.just(1, 2), Observable.just(3, 4), Observable.just(5, 6), Observable.just(7, 8)) .subscribe(new Observer < Integer > () { ........................................................... }); |
concatArray() | 与 concat() 作用一样,不过 concatArray() 可以发送多于 4 个被观察者。 | ........................................ |
merge() | 这个方法月 concat() 作用基本一样,concat() 是串行发送事件,而 merge() 并行发送事件。 | 只有等到第一个被观察者发送完事件之后,第二个被观察者才会发送事件。 mergeArray() 与 merge() 的作用是一样的,只是它可以发送4个以上的被观察者 |
conctArrayDelayError() & mergeArrayDelayError() | 在 concatArray() 和 mergeArray() 两个方法当中,如果其中有一个被观察者发送了一个 Error 事件,那么就会停止发送事件,如果你想 onError() 事件延迟到所有被观察者都发送完事件后再执行的话,就可以使用 concatArrayDelayError() 和 mergeArrayDelayError() | Observable.concatArrayDelayError( Observable.create(new ObservableOnSubscribe < Integer > () { @Override public void subscribe(ObservableEmitter < Integer > e) throws Exception { e.onNext(1); e.onError(new NumberFormatException()); } }), Observable.just(2, 3, 4)) .subscribe(new Observer < Integer > () { @Override public void onNext(Integer integer) { Log.d(TAG, "===================onNext " + integer); } ............................ }); ---------------------打印结果---------------------- ===================onNext 1 ===================onNext 2 ===================onNext 3 ===================onNext 4 ===================onError |
zip() | 会将多个被观察者合并,根据各个被观察者发送事件的顺序一个个结合起来,最终发送的事件数量会与源 Observable 中最少事件的数量一样。 | Observable.zip(Observable.intervalRange(1, 5, 1, 1, TimeUnit.SECONDS) .map(new Function<Long, String>() { @Override public String apply(Long aLong) throws Exception { String s1 = "A" + aLong; Log.d(TAG, "===================A 发送的事件 " + s1); return s1; }}), Observable.intervalRange(1, 6, 1, 1, TimeUnit.SECONDS) .map(new Function<Long, String>() { @Override public String apply(Long aLong) throws Exception { String s2 = "B" + aLong; Log.d(TAG, "===================B 发送的事件 " + s2); return s2; } }), new BiFunction<String, String, String>() { @Override public String apply(String s, String s2) throws Exception { String res = s + s2; return res; } }) .subscribe(new Observer<String>() { ................................. }); ---------------------打印结果---------------------- ===================onSubscribe ===================A 发送的事件 A1 ===================B 发送的事件 B1 ===================onNext A1B1 ===================A 发送的事件 A2 ===================B 发送的事件 B2 ===================onNext A2B2 ===================A 发送的事件 A3 ===================B 发送的事件 B3 ===================onNext A3B3 ===================A 发送的事件 A4 ===================B 发送的事件 B4 ===================onNext A4B4 ===================A 发送的事件 A5 ===================B 发送的事件 B5 ===================onNext A5B5 ===================onComplete 可以发现最终接收到的事件数量是5,那么为什么第二个 Observable 没有发送第6个事件呢?因为在这之前第一个 Observable 已经发送了 onComplete 事件,所以第二个 Observable 不会再发送事件。 |
combineLatest() combineLatestDelayError() | combineLatest() 的作用与 zip() 类似,但是 combineLatest() 发送事件的序列是与发送的时间线有关的,当 combineLatest() 中所有的 Observable 都发送了事件,只要其中有一个 Observable 发送事件,这个事件就会和其他 Observable 最近发送的事件结合起来发送,这样可能还是比较抽象,看看以下例子代码。 | 上面代码 当发送 A1 事件之后,因为 B 并没有发送任何事件,所以根本不会发生结合。当 B 发送了 B1 事件之后,就会与 A 最近发送的事件 A2 结合成 A2B1,这样只有后面一有被观察者发送事件,这个事件就会与其他被观察者最近发送的事件结合起来了。 因为 combineLatestDelayError() 就是多了延迟发送 onError() 功能 |
reduce() | 与 scan() 操作符的作用也是将发送数据以一定逻辑聚合起来,这两个的区别在于 scan() 每处理一次数据就会将事件发送给观察者,而 reduce() 会将所有数据聚合在一起才会发送事件给观察者。 | Observable.just(0, 1, 2, 3) .reduce(new BiFunction < Integer, Integer, Integer > () { @Override public Integer apply(Integer integer, Integer integer2) throws Exception { int res = integer + integer2; Log.d(TAG, "====================integer " + integer); Log.d(TAG, "====================integer2 " + integer2); Log.d(TAG, "====================res " + res); return res; } }) .subscribe(new Consumer < Integer > () { @Override public void accept(Integer integer) throws Exception { Log.d(TAG, "==================accept " + integer); } }); ---------------- 结果 --------------------- ====================integer 0 ====================integer2 1 ====================res 1 ====================integer 1 ====================integer2 2 ====================res 3 ====================integer 3 ====================integer2 3 ====================res 6 ==================accept 6 |
collect() | 将数据收集到数据结构当中。 | Observable.just(1, 2, 3, 4) .collect(new Callable < ArrayList < Integer >> () { @Override public ArrayList < Integer > call() throws Exception { return new ArrayList < > (); } }, new BiConsumer < ArrayList < Integer > , Integer > () { @Override public void accept(ArrayList < Integer > integers, Integer integer) throws Exception { integers.add(integer); } }) .subscribe(new Consumer < ArrayList < Integer >> () { @Override public void accept(ArrayList < Integer > integers) throws Exception { Log.d(TAG, "===============accept " + integers); } }); ---------------------结果------------------------ ===============accept [1, 2, 3, 4] |
startWith() startWithArray() | 在发送事件之前追加事件,startWith() 追加一个事件,startWithArray() 可以追加多个事件。追加的事件会先发出。 | Observable.just(5, 6, 7) .startWithArray(2, 3, 4) .startWith(1) .subscribe(new Consumer < Integer > () { @Override public void accept(Integer integer) throws Exception { Log.d(TAG, "================accept " + integer); } }); ---------------------结果------------------- ================accept 1 ================accept 2 ================accept 3 ================accept 4 ================accept 5 ================accept 6 ================accept 7 |
count() | 返回被观察者发送事件的数量。 | Observable.just(1, 2, 3) .count() .subscribe(new Consumer < Long > () { @Override public void accept(Long aLong) throws Exception { Log.d(TAG, "=======================aLong " + aLong); } }); --------------- 打印结果 --------------- =======================aLong 3 |
5. 功能操作符
名称 | 有什么用 | 怎么用 |
delay() | 延迟一段事件发送事件。 | Observable.just(1, 2, 3) //延迟了两秒才发送事件 .delay(2, TimeUnit.SECONDS) .subscribe(new Observer < Integer > () { ..................................................... }); |
doOnEach() | Observable 每发送一件事件之前都会先回调这个方法。 | Observable.create(new ObservableOnSubscribe < Integer > () { @Override public void subscribe(ObservableEmitter < Integer > e) throws Exception { e.onNext(1); ............................. e.onComplete(); } }) .doOnEach(new Consumer < Notification < Integer >> () { @Override public void accept(Notification < Integer > integerNotification) throws Exception { Log.d(TAG, "==================doOnEach " + integerNotification.getValue()); } }) .subscribe(new Observer < Integer > () { ........ }); ---------------------- 打印结果 ---------------------- ==================onSubscribe ==================doOnEach 1 ==================onNext 1 ==================doOnEach 2 ==================onNext 2 ==================doOnEach 3 ==================onNext 3 ==================doOnEach null ==================onComplete |
doOnNext() | Observable 每发送 onNext() 之前都会先回调这个方法。 | 代码同上,不一样的是 .doOnNext(new Consumer < Integer > () { @Override public void accept(Integer integer) throws Exception { Log.d(TAG, "==================doOnNext " + integer); } }) ---------------------- 打印结果 ---------------------- ==================onSubscribe ==================doOnNext 1 ==================onNext 1 ==================doOnNext 2 ==================onNext 2 ==================doOnNext 3 ==================onNext 3 ==================onComplete |
doAfterNext() | Observable 每发送 onNext() 之后都会回调这个方法。 | 代码同上,不一样的是 .doAfterNext(new Consumer < Integer > () { @Override public void accept(Integer integer) throws Exception { Log.d(TAG, "==================doAfterNext " + integer); } }) ---------------------- 打印结果 ---------------------- ==================onSubscribe ==================onNext 1 ==================doAfterNext 1 ==================onNext 2 ==================doAfterNext 2 ==================onNext 3 ==================doAfterNext 3 ==================onComplete |
doOnComplete() | Observable 每发送 onComplete() 之前都会回调这个方法。 | 代码同上,不一样的是 .doOnComplete(new Action() { @Override public void run() throws Exception { Log.d(TAG, "==================doOnComplete "); } }) ---------------------- 打印结果 ---------------------- ==================onSubscribe ==================onNext 1 ==================onNext 2 ==================onNext 3 ==================doOnComplete ==================onComplete |
doOnError() | Observable 每发送 onError() 之前都会回调这个方法。 | 代码同上,不一样的是 .doOnError(new Consumer < Throwable > () { @Override public void accept(Throwable throwable) throws Exception { Log.d(TAG, "==================doOnError " + throwable); } }) ---------------------- 打印结果 ---------------------- ==================onSubscribe ==================onNext 1 ==================onNext 2 ==================onNext 3 ==================doOnError java.lang.NullPointerException ==================onError |
doOnSubscribe() | Observable 每发送 onSubscribe() 之前都会回调这个方法。 | 代码同上,不一样的是 .doOnSubscribe(new Consumer < Disposable > () { @Override public void accept(Disposable disposable) throws Exception { Log.d(TAG, "==================doOnSubscribe "); } }) ---------------------- 打印结果 ---------------------- ==================doOnSubscribe ==================onSubscribe ==================onNext 1 ==================onNext 2 ==================onNext 3 ==================onComplete |
doOnDispose() | 当调用 Disposable 的 dispose() 之后回调该方法。 | 代码同上,不一样的是 .doOnDispose(new Action() { @Override public void run() throws Exception { Log.d(TAG, "==================doOnDispose "); } }) .subscribe(new Observer < Integer > () { private Disposable d; @Override public void onSubscribe(Disposable d) { Log.d(TAG, "==================onSubscribe "); this.d = d; } @Override public void onNext(Integer integer) { Log.d(TAG, "==================onNext " + integer); d.dispose(); } ............................................... }); ---------------------- 打印结果 ---------------------- ==================doOnSubscribe ==================onSubscribe ==================onNext 1 ==================onNext 2 ==================onNext 3 ==================onComplete |
doOnLifecycle() | 在回调 onSubscribe 之前回调该方法的第一个参数的回调方法,可以使用该回调方法决定是否取消订阅。 | 代码同上,不一样的是 .doOnLifecycle(new Consumer<Disposable>() { @Override public void accept(Disposable disposable) throws Exception { Log.d(TAG, "==================doOnLifecycle accept"); } }, new Action() { @Override public void run() throws Exception { Log.d(TAG, "==================doOnLifecycle Action"); } }) .doOnDispose( new Action() { @Override public void run() throws Exception { Log.d(TAG, "==================doOnDispose Action"); } }) .subscribe(new Observer<Integer>() { private Disposable d; @Override public void onSubscribe(Disposable d) { Log.d(TAG, "==================onSubscribe "); this.d = d; } @Override public void onNext(Integer integer) { Log.d(TAG, "==================onNext " + integer); d.dispose(); } ............................................... }); ---------------------- 打印结果 ---------------------- ==================doOnLifecycle accept ==================onSubscribe ==================onNext 1 ==================doOnDispose Action ==================doOnLifecycle Action |
doOnTerminate() doAfterTerminate() | doOnTerminate 是在 onError 或者 onComplete 发送之前回调,而 doAfterTerminate 则是 onError 或者 onComplete 发送之后回调。 | 代码同上,不一样的是 .doOnTerminate(new Action() { @Override public void run() throws Exception { Log.d(TAG, "==================doOnTerminate "); } }) .doAfterTerminate (new Action() { @Override public void run() throws Exception { Log.d(TAG, "==================doAfterTerminate "); } }) ---------------------- 打印结果 ---------------------- ==================onSubscribe ==================onNext 1 ==================onNext 2 ==================onNext 3 ==================doOnTerminate ==================onComplete ==================doAfterTerminate |
doFinally() | 在所有事件发送完毕之后回调该方法。 | 代码同上,不一样的是 .doFinally(new Action() { @Override public void run() throws Exception { Log.d(TAG, "==================doFinally "); } }) .doOnDispose() .doAfterTerminate() ---------------------- 打印结果 ---------------------- ==================onSubscribe ==================onNext 1 ==================doOnDispose ==================doFinally doAfterTerminate() 已经成功回调,doFinally() 还是会在事件序列的最后。 |
onErrorReturn() | 当接受到一个 onError() 事件之后回调,返回的值会回调 onNext() 方法,并正常结束该事件序列。 | Observable.create(new ObservableOnSubscribe<Integer>() { @Override public void subscribe(ObservableEmitter<Integer> e) throws Exception { e.onNext(1); e.onNext(2); e.onNext(3); e.onError(new NullPointerException()); } }) .onErrorReturn(new Function<Throwable, Integer>() { @Override public Integer apply(Throwable throwable) throws Exception { Log.d(TAG, "==================onErrorReturn " + throwable); return 404; } }) .subscribe(new Observer<Integer>() { ........................................... }); ---------------------- 打印结果 ---------------------- ==================onSubscribe ==================onNext 1 ==================onNext 2 ==================onNext 3 ==================onErrorReturn java.lang.NullPointerException ==================onNext 404 ==================onComplete |
onErrorResumeNext() | 当接收到 onError() 事件时,返回一个新的 Observable,并正常结束事件序列。 | 代码同上,不一样的是 .onErrorResumeNext(new Function<Throwable, ObservableSource<? extends Integer>>() { @Override public ObservableSource<? extends Integer> apply(Throwable throwable) throws Exception { Log.d(TAG, "==================onErrorResumeNext " + throwable); return Observable.just(4, 5, 6); } }) ---------------------- 打印结果 ---------------------- ==================onSubscribe ==================onNext 1 ==================onNext 2 ==================onNext 3 ==================onErrorResumeNext java.lang.NullPointerException ==================onNext 4 ==================onNext 5 ==================onNext 6 ==================onComplete |
onExceptionResumeNext() | 与 onErrorResumeNext() 作用基本一致,但是这个方法只能捕捉 Exception。不能捕获new Error("404")) | Observable.create(new ObservableOnSubscribe<Integer>() { @Override public void subscribe(ObservableEmitter<Integer> e) throws Exception { e.onNext(1); e.onNext(2); e.onNext(3); e.onError(new Error("404")); } }) .onExceptionResumeNext(new Observable<Integer>() { @Override protected void subscribeActual(Observer<? super Integer> observer) { observer.onNext(333); observer.onComplete(); } }) ---------------------- 打印结果 ---------------------- ==================onSubscribe ==================onNext 1 ==================onNext 2 ==================onNext 3 ==================onError 观察者收到 onError() 事件,证明 onErrorResumeNext() 不能捕捉 Error 事件。 将被观察者的 e.onError(new Error("404")) 改为 e.onError(new Exception("404")),现在看看是否能捕捉 Exception 事件: ---------------------- 打印结果 ---------------------- ==================onSubscribe ==================onNext 1 ==================onNext 2 ==================onNext 3 ==================onNext 333 ==================onComplete |
retry() | 如果出现错误事件,则会重新发送所有事件序列。times 是代表重新发的次数。 | 代码同上,不一样的是(retry(代表重新发的次数)) .retry(2) ---------------------- 打印结果 ---------------------- ==================onSubscribe ==================onNext 1 ==================onNext 2 ==================onNext 3 ==================onNext 1 ==================onNext 2 ==================onNext 3 ==================onNext 1 ==================onNext 2 ==================onNext 3 ==================onError |
retryUntil() | 出现错误事件之后,可以通过此方法判断是否继续发送事件。 | 代码同上,不一样的是 .retryUntil(new BooleanSupplier() { @Override public boolean getAsBoolean() throws Exception { if (i == 6) { return true; } return false; } }) ---------------------- 打印结果 ---------------------- ==================onSubscribe ==================onNext 2 ==================onNext 3 ==================onError |
retryWhen() | 当被观察者接收到异常或者错误事件时会回调该方法,这个方法会返回一个新的被观察者。如果返回的被观察者发送 Error 事件则之前的被观察者不会继续发送事件,如果发送正常事件则之前的被观察者会继续不断重试发送事件。 | Observable.create(new ObservableOnSubscribe < String > () { @Override public void subscribe(ObservableEmitter < String > e) throws Exception { e.onNext("chan"); e.onNext("ze"); e.onNext("de"); e.onError(new Exception("404")); e.onNext("haha"); } }) .retryWhen(new Function < Observable < Throwable > , ObservableSource <? >> () { @Override public ObservableSource <? > apply(Observable < Throwable > throwableObservable) throws Exception { return throwableObservable.flatMap(new Function < Throwable, ObservableSource <? >> () { @Override public ObservableSource <? > apply(Throwable throwable) throws Exception { if(!throwable.toString().equals("java.lang.Exception: 404")) { return Observable.just("可以忽略的异常"); } else { return Observable.error(new Throwable("终止啦")); } } }); } }) --------------- 打印结果 --------------- ==================onSubscribe ==================onNext ze ==================onNext de ==================onError java.lang.Throwable: 终止啦 将 onError(new Exception("404")) 改为 onError(new Exception("303")) 看看打印结果: ==================onNext chan ==================onNext ze ==================onNext de ==================onNext chan ==================onNext ze ==================onNext de ==================onNext chan ......从结果可以看出,会不断重复发送消息。 |
repeat() | 重复发送被观察者的事件,times 为发送次数。 | Observable.create(new ObservableOnSubscribe < Integer > () { @Override public void subscribe(ObservableEmitter < Integer > e) throws Exception { e.onNext(1); e.onNext(2); e.onNext(3); e.onComplete(); } }) .repeat(2) --------------- 打印结果 --------------- ===================onSubscribe ===================onNext 1 ===================onNext 2 ===================onNext 3 ===================onNext 1 ===================onNext 2 ===================onNext 3 ===================onComplete |
repeatWhen() | 这个方法可以会返回一个新的被观察者设定一定逻辑来决定是否重复发送事件。 | Observable.create(new ObservableOnSubscribe < Integer > () { ..................... e.onNext(1); e.onNext(2); e.onNext(3); e.onComplete(); }) .repeatWhen(new Function < Observable < Object > , ObservableSource <? >> () { @Override public ObservableSource <? > apply(Observable < Object > objectObservable) throws Exception { return Observable.empty(); // return Observable.error(new Exception("404")); // return Observable.just(4); null; } }) --------------- 打印结果 --------------- ===================onSubscribe ===================onComplete 直接看看发送 onError 事件和其他事件的打印结果。 发送 onError 打印结果: ===================onSubscribe ===================onError 发送其他事件的打印结果: ===================onSubscribe ===================onNext 1 ===================onNext 2 ===================onNext 3 ===================onComplete |
subscribeOn() | 指定被观察者的线程,要注意的时,如果多次调用此方法,只有第一次有效。( subscribeOn()主要改变的是订阅的线程,即call()执行的线程;) | 下面提到的“操作”包括产生事件、用操作符操作事件以及最终的通过 subscriber 消费事件; 只有第一subscribeOn() 起作用(所以多个 subscribeOn() 无意义); 这个 subscribeOn() 控制从流程开始的第一个操作,直到遇到第一个 observeOn(); observeOn() 可以使用多次,每个 observeOn() 将导致一次线程切换(),这次切换开始于这次 observeOn() 的下一个操作; 不论是 subscribeOn() 还是 observeOn(),每次线程切换如果不受到下一个 observeOn() 的干预,线程将不再改变,不会自动切换到其他线程。 |
observeOn() | 指定观察者的线程,每指定一次就会生效一次。 | 调度器 作用 Schedulers.computation( ) 用于使用计算任务,如事件循环和回调处理 Schedulers.immediate( ) 当前线程 Schedulers.io( ) 用于 IO 密集型任务,如果异步阻塞 IO 操作。 Schedulers.newThread( ) 创建一个新的线程 AndroidSchedulers.mainThread() Android 的 UI 线程,用于操作 UI。 |
6. 过滤操作符
filter() | 通过一定逻辑来过滤被观察者发送的事件,如果返回 true 则会发送事件,否则不会发送。 | Observable.just(1, 2, 3) .filter(new Predicate < Integer > () { @Override public boolean test(Integer integer) throws Exception { return integer < 2; } }) .......................... --------------- 打印结果 -------------- ==================onSubscribe ==================onNext 1 ==================onComplete 。 |
ofType() | 可以过滤不符合该类型事件 | Observable.just(1, 2, 3, "chan", "zhide") .ofType(Integer.class) ............................................. --------------- 打印结果 -------------- ==================onSubscribe ==================onNext 1 ==================onNext 2 ==================onNext 3 ==================onComplete |
skip() skipLast() | 跳过正序某些事件,count 代表跳过事件的数量 skipLast() 作用也是跳过某些事件,不过它是用来跳过正序的后面的事件 | Observable.just(1, 2, 3) .skip(2) ............................................. --------------- 打印结果 -------------- ==================onSubscribe ==================onNext 3 ==================onComplete |
distinct() | 过滤事件序列中的重复事件。 | Observable.just(1, 2, 3, 3, 2, 1) .distinct() .................... --------------- 打印结果 -------------- ==================onSubscribe ==================onNext 1 ==================onNext 2 ==================onNext 3 ==================onComplete |
distinctUntilChanged() | 过滤掉连续重复的事件 | Observable.just(1, 2, 3, 3, 2, 1) .distinctUntilChanged() .................................................. --------------- 打印结果 -------------- ==================onSubscribe ==================onNext 1 ==================onNext 2 ==================onNext 3 ==================onNext 2 ==================onNext 1 ==================onComplete |
take() | 控制观察者接收的事件的数量。 | Observable.just(1, 2, 3, 4, 5) .take(3) .................................. --------------- 打印结果 -------------- ==================onSubscribe ==================onNext 1 ==================onNext 2 ==================onNext 3 ==================onComplete |
debounce() | 如果两件事件发送的时间间隔小于设定的时间间隔则前一件事件就不会发送给观察者。 throttleWithTimeout() 与此方法的作用一样 | Observable.create(new ObservableOnSubscribe < Integer > () { e.onNext(1); Thread.sleep(900); e.onNext(2); } .debounce(1, TimeUnit.SECONDS) ................................ --------------- 打印结果 -------------- ===================onSubscribe ===================onNext 2 事件1并没有发送出去,现在将间隔时间改为1000 ===================onSubscribe ===================onNext 1 ===================onNext 2 |
firstElement() lastElement() | firstElement() 取事件序列的第一个元素,lastElement() 取事件序列的最后一个元素。 | Observable.just(1, 2, 3, 4) .firstElement() ................................... ==================onNext 1 .lastElement() .................................... ==================onNext 4 |
elementAt() elementAtOrError() | elementAt() 可以指定取出事件序列中事件,但是输入的 index 超出事件序列的总数的话就不会出现任何结果。这种情况下,你想发出异常信息的话就用 elementAtOrError() 。 | Observable.just(1, 2, 3, 4) //(下标) .elementAtOrError(0) ....................... ==================onNext 1 |