java observable 使用_Rxjava2 Observable的辅助操作详解及实例(一)

简要:

需求了解:

Rxjava中有一些方便的辅助操作符,来更方便我们的函数式的编程。比如延迟、定时、指定操作的监听、数据类型转换等一系列的操作。

下面列出了一些用于Observable的辅助操作符:

Delay:延时发射Observable的结果。

Do:注册一个动作作为原始Observable生命周期事件的监听器。

SubscribeOn:指定Observable自身在哪个调度器上执行。

ObserverOn:指定一个观察者在哪个调度器上观察这个Observable。

Serialize:强制一个Observable连续调用并保证行为正确,其实就是同步事件操作。

Materialize/Dematerialize:将数据项和事件通知都当做数据项发射 ,Dematerialize 刚好相反。

TimeInterval:将一个发射数据的Observable转换为发射那些数据发射时间间隔的Observable。

Timeout:对原始Observable的一个镜像,如果过了一个指定的时长仍没有发射数据,它会发一个错误通知。

Timestamp:给Observable发射的数据项附加一个指定的时间戳。

Using:创建一个只在Observable生命周期内存在的一次性资源。

To:将Observable转换为另一个对象或数据结构。

1. Delay

延迟一段指定的时间再发射来自Observable的发射物。

17d56e2b08e26fee19fddff61cfdeb18.png

Delay 操作符让原始 Observable 在发射每项数据之前都暂停一段指定的时间段。效果是Observable发射的数据项在时间上向前整体平移了一个增量。

1.1 delay(long delay, TimeUnit unit)

延迟指定时间段后发射原始Observable发射的数据序列,如果发生异常的话,会立即发射通知给观察者。

8a2a0188b02378164ac10b1308c70092.png

1.2 delay(Function itemDelay)

使用一个函数针对原始 Observable 的每一项数据返回一个 Observable ,它监视返回的这个 Observable ,当任何那样的 Observable 终止时,delay 返回的 Observable 就发射关联的那项数据。

030cabd68f224672133856c36479ab0c.png

1.3 delay(ObservableSource subscriptionDelay, Function itemDelay)

延迟直到 subscriptionDelay 发射第一个数据项后开始订阅原始 Observable,然后再使用一个函数针对原始Observable的每一项数据返回一个Observable,它监视返回的这个Observable,当任何那样的 Observable 终止时,delay 返回的 Observable 就发射关联的那项数据。

1c64947303ebcc380c04e1081d8ae34a.png

示例代码:

// 创建Observable

Observable observable = Observable.create(new ObservableOnSubscribe() {

@Override

public void subscribe(ObservableEmitter emitter) throws Exception {

emitter.onNext(1);

emitter.onNext(2);

emitter.onNext(3);

// emitter.onError(new Exception("Test Error!"));

emitter.onNext(4);

emitter.onNext(5);

emitter.onComplete();

}

});

/**

* 1. delay(long delay, TimeUnit unit,

* Scheduler scheduler: 可选参数,指定工作线程

* boolean delayError: 可选参数,延迟异常通知到最后

* )

* 延迟指定时间段后发射原始Observable发射的数据序列,如果发生异常的话,会立即发射通知给观察者。

*/

observable.doOnNext(new Consumer() {

@Override

public void accept(Integer integer) throws Exception {

System.out.println("--> doOnNext(1): " + integer);

}

}).delay(1, TimeUnit.SECONDS, Schedulers.newThread(), false) // 在子线程中延迟1秒发射数据,不延迟异常通知

.subscribe(new Observer() {

@Override

public void onSubscribe(Disposable d) {

System.out.println("--> onSubscribe(1)");

}

@Override

public void onNext(Integer integer) {

System.out.println("--> onNext(1): " + integer);

}

@Override

public void onError(Throwable e) {

System.out.println("--> onError(1): " + e);

}

@Override

public void onComplete() {

System.out.println("--> onCompleted(1)");

}

});

System.in.read();

System.out.println("-----------------------------------------------------");

/**

* 2. delay(Function> itemDelay)

* 使用一个函数针对原始Observable的每一项数据返回一个Observable,它监视返回的这个Observable,

* 当任何那样的 Observable 终止时,delay 返回的 Observable 就发射关联的那项数据。

*/

observable.doOnNext(new Consumer() {

@Override

public void accept(Integer integer) throws Exception {

System.out.println("--> doOnNext(2): " + integer);

}

}).delay(new Function>() {

@Override

public ObservableSource apply(Integer integer) throws Exception {

System.out.println("--> ObservableSource(2): " + integer);

Observable timer = Observable.timer(integer, TimeUnit.SECONDS);

return timer;

}

}).subscribe(new Observer() {

@Override

public void onSubscribe(Disposable d) {

System.out.println("--> onSubscribe(2)");

}

@Override

public void onNext(Integer integer) {

System.out.println("--> onNext(2): " + integer);

}

@Override

public void onError(Throwable e) {

System.out.println("--> onError(2): " + e);

}

@Override

public void onComplete() {

System.out.println("--> onCompleted(2)");

}

});

System.in.read();

System.out.println("-----------------------------------------------------");

/**

* 3. delay(ObservableSource subscriptionDelay, Function itemDelay)

* 延迟直到subscriptionDelay发射第一个数据项后开始订阅原始Observable

* 然后再使用一个函数针对原始Observable的每一项数据返回一个Observable,它监视返回的这个Observable,

* 当任何那样的 Observable 终止时,delay 返回的 Observable 就发射关联的那项数据。

*/

observable.doOnNext(new Consumer() {

@Override

public void accept(Integer integer) throws Exception {

System.out.println("--> doOnNext(3): " + integer);

}

// 延迟3秒后开始订阅源Observable,然后对发射的每项数据进行function函数延迟

}).delay(Observable.timer(3, TimeUnit.SECONDS), new Function>() {

@Override

public ObservableSource apply(Integer integer) throws Exception {

System.out.println("--> apply(3): " + integer);

return Observable.timer(integer, TimeUnit.SECONDS);

}

}).subscribe(new Observer() {

@Override

public void onSubscribe(Disposable d) {

System.out.println("--> onSubscribe(3)");

}

@Override

public void onNext(Integer integer) {

System.out.println("--> onNext(3): " + integer);

}

@Override

public void onError(Throwable e) {

System.out.println("--> onError(3): " + e);

}

@Override

public void onComplete() {

System.out.println("--> onCompleted(3)");

}

});

System.in.read();

输出:

--> onSubscribe(1)

--> doOnNext(1): 1

--> doOnNext(1): 2

--> doOnNext(1): 3

--> doOnNext(1): 4

--> doOnNext(1): 5

--> onNext(1): 1

--> onNext(1): 2

--> onNext(1): 3

--> onNext(1): 4

--> onNext(1): 5

--> onCompleted(1)

-----------------------------------------------------

--> onSubscribe(2)

--> doOnNext(2): 1

--> ObservableSource(2): 1

--> doOnNext(2): 2

--> ObservableSource(2): 2

--> doOnNext(2): 3

--> ObservableSource(2): 3

--> doOnNext(2): 4

--> ObservableSource(2): 4

--> doOnNext(2): 5

--> ObservableSource(2): 5

--> onNext(2): 1

--> onNext(2): 2

--> onNext(2): 3

--> onNext(2): 4

--> onNext(2): 5

--> onCompleted(2)

-----------------------------------------------------

--> onSubscribe(3)

--> doOnNext(3): 1

--> apply(3): 1

--> doOnNext(3): 2

--> apply(3): 2

--> doOnNext(3): 3

--> apply(3): 3

--> doOnNext(3): 4

--> apply(3): 4

--> doOnNext(3): 5

--> apply(3): 5

--> onNext(3): 1

--> onNext(3): 2

--> onNext(3): 3

--> onNext(3): 4

--> onNext(3): 5

--> onCompleted(3)

2. Do

注册一个动作作为原始Observable生命周期事件的监听器。

51ccde15237f731b132314a9137d03d2.png

你可以注册指定的回调,当Observable的某个事件发生时,Rxjava 会在与 Observable 链关联的正常通知集合中调用它。

在Rxjava中有许多相关Do的变体,分别进行不同场景的事件监听,一般有下面几种操作方法:

doOnSubscribe(Consumer onSubscribe):一旦有观察者订阅了Observable,就会被调用。

doOnLifecycle(Consumer onSubscribe, Action onDispose): 在观察者订阅产生和解除时被调用。

doOnNext(Consumer onNext):在 Observable 每次发射数据前被调用。

doOnEach(Observer observer): 在 Observable 调用观察者的所有通知前被调用。

doAfterNext(Consumer onAfterNext):在 Observable 调用OnNext通知(数据发射通知)之后被调用。

doOnError(Consumer onError):注册一个动作,当它的 Observable 由于异常终止调用 onError 时会被调用。

doOnTerminate(Action onTerminate): 当Observable终止之前会被调用,无论是正常还是异常终止。

doAfterTerminate(Action onFinally): 当Observable终止之后会被调用,无论是正常还是异常终止。

doOnComplete(Action onComplete):Observable正常终止调用 onCompleted 时会被调用。

doFinally(Action onFinally):Observable终止之后会被调用,无论是正常还是异常终止,但是优先于doAfterTerminate。

doOnDispose(Action onDispose):在观察者调用Disposable的dispose()方法时被调用。

示例代码:

/**

* 1. doOnSubscribe(Consumer onSubscribe)

* 一旦有观察者订阅了Observable,就会被调用

*/

Observable.just(999).doOnSubscribe(new Consumer() {

@Override

public void accept(Disposable disposable) throws Exception {

System.out.println("----> doOnSubscribe");

}

}).subscribe(new Observer() {

@Override

public void onSubscribe(Disposable d) {

System.out.println("--> onSubscribe(1)");

}

@Override

public void onNext(Integer integer) {

System.out.println("--> onNext(1): " + integer);

}

@Override

public void onError(Throwable e) {

System.out.println("--> onError(1): " + e);

}

@Override

public void onComplete() {

System.out.println("--> onCompleted(1)");

}

});

System.out.println("--------------------------------------------");

/**

* 2. doOnLifecycle(Consumer onSubscribe, Action onDispose)

* onSubscribe: 接受观察者订阅前的通知,可以在此通知中解除订阅

* onDispose: 接受观察者调用解除订阅通知

* 在观察者订阅产生和解除时调用

*/

Observable.just(999).doOnLifecycle(new Consumer() {

@Override

public void accept(Disposable disposable) throws Exception {

System.out.println("----> doOnLifecycle onSubscribe(2)");

// disposable.dispose(); // 可以在观察者订阅前直接解除订阅

}

}, new Action() {

@Override

public void run() throws Exception {

System.out.println("----> doOnLifecycle onDispose(2)");

}

}).subscribe(new Observer() {

private Disposable disposable;

@Override

public void onSubscribe(Disposable d) {

disposable = d;

System.out.println("--> onSubscribe(2)");

}

@Override

public void onNext(Integer integer) {

System.out.println("--> onNext(2): " + integer);

disposable.dispose(); // 手动解除订阅

}

@Override

public void onError(Throwable e) {

System.out.println("--> onError(2): " + e);

}

@Override

public void onComplete() {

System.out.println("--> onCompleted(2)");

}

});

System.out.println("--------------------------------------------");

/**

* 3. doOnNext(Consumer onNext)

* 在Observable每次发射数据前被调用

*/

Observable.just(999).doOnNext(new Consumer() {

@Override

public void accept(Integer integer) throws Exception {

System.out.println("----> doOnNext(3): " + integer);

}

}).subscribe(new Consumer() {

@Override

public void accept(Integer integer) throws Exception {

System.out.println("--> accept(3): " + integer);

}

});

System.out.println("--------------------------------------------");

/**

* 4. doOnEach(Observer observer)

* 在Observable调用观察者的所有通知前被调用

*/

Observable.just(999).doOnEach(new Observer() {

@Override

public void onSubscribe(Disposable d) {

System.out.println("----> doOnEach(4) onSubscribe");

}

@Override

public void onNext(Integer integer) {

System.out.println("----> doOnEach(4) onNext: " + integer);

}

@Override

public void onError(Throwable e) {

System.out.println("----> doOnEach(4) onError: " + e);

}

@Override

public void onComplete() {

System.out.println("----> doOnEach(4) onComplete");

}

}).subscribe(new Observer() {

@Override

public void onSubscribe(Disposable d) {

System.out.println("--> onSubscribe(4)");

}

@Override

public void onNext(Integer integer) {

System.out.println("--> onNext(4): " + integer);

}

@Override

public void onError(Throwable e) {

System.out.println("--> onError(4): " + e);

}

@Override

public void onComplete() {

System.out.println("--> onCompleted(4)");

}

});

System.out.println("--------------------------------------------");

/**

* 5. doAfterNext(Consumer onAfterNext)

* 在Observable调用OnNext通知(数据发射通知)之后被调用

*/

Observable.just(999).doAfterNext(new Consumer() {

@Override

public void accept(Integer integer) throws Exception {

System.out.println("----> doAfterNext(5): " + integer);

}

}).subscribe(new Consumer() {

@Override

public void accept(Integer integer) throws Exception {

System.out.println("--> onNext(5): " + integer);

}

});

System.out.println("--------------------------------------------");

/**

* 6. doOnError(Consumer onError)

* 注册一个动作,当它的Observable由于异常终止调用 onError 时会被调用

*/

Observable.create(new ObservableOnSubscribe() {

@Override

public void subscribe(ObservableEmitter emitter) throws Exception {

emitter.onError(new Exception("Test Error!"));

}

}).doOnError(new Consumer() {

@Override

public void accept(Throwable throwable) throws Exception {

System.out.println("----> doOnError(6): " + throwable);

}

}).subscribe(new Observer() {

@Override

public void onSubscribe(Disposable d) {

System.out.println("--> onSubscribe(6)");

}

@Override

public void onNext(Integer integer) {

System.out.println("--> onNext(6): " + integer);

}

@Override

public void onError(Throwable e) {

System.out.println("--> onError(6): " + e);

}

@Override

public void onComplete() {

System.out.println("--> onComplete(6)");

}

});

System.out.println("--------------------------------------------");

/**

* 7.

* doOnTerminate(Action onTerminate): 当Observable终止之前会被调用,无论是正常还是异常终止

* doAfterTerminate(Action onFinally): 当Observable终止之后会被调用,无论是正常还是异常终止

*/

Observable.just(999).doOnTerminate(new Action() {

@Override

public void run() throws Exception {

System.out.println("----> doOnTerminate(7)");

}

}).subscribe(new Consumer() {

@Override

public void accept(Integer integer) throws Exception {

System.out.println("--> accept(7): " + integer);

}

});

System.out.println("--------------------------------------------");

/**

* 8. doOnComplete(Action onComplete)

* Observable正常终止调用 onCompleted 时会被调用

*/

Observable.just(999).doOnComplete(new Action() {

@Override

public void run() throws Exception {

System.out.println("----> doOnComplete(8)");

}

}).subscribe(new Observer() {

@Override

public void onSubscribe(Disposable d) {

System.out.println("--> onSubscribe(8)");

}

@Override

public void onNext(Integer integer) {

System.out.println("--> onNext(8): " + integer);

}

@Override

public void onError(Throwable e) {

System.out.println("--> onError(8): " + e);

}

@Override

public void onComplete() {

System.out.println("--> onComplete(8)");

}

});

System.out.println("--------------------------------------------");

/**

* 9. doFinally(Action onFinally)

* Observable终止之后会被调用,无论是正常还是异常终止,但是优先于doAfterTerminate

*/

Observable.just(999).doFinally(new Action() {

@Override

public void run() throws Exception {

System.out.println("----> doFinally(9)");

}

}).subscribe(new Observer() {

@Override

public void onSubscribe(Disposable d) {

System.out.println("--> onSubscribe(9)");

}

@Override

public void onNext(Integer integer) {

System.out.println("--> onNext(9): " + integer);

}

@Override

public void onError(Throwable e) {

System.out.println("--> onError(9): " + e);

}

@Override

public void onComplete() {

System.out.println("--> onComplete(9)");

}

});

System.out.println("--------------------------------------------");

/**

* 10. doOnDispose(Action onDispose)

* 在观察者调用Disposable的dispose()方法时被调用

*/

Observable.just(999).doOnDispose(new Action() {

@Override

public void run() throws Exception {

System.out.println("----> doOnDispose(10)");

}

}).subscribe(new Observer() {

@Override

public void onSubscribe(Disposable d) {

System.out.println("--> onSubscribe(10)");

d.dispose();

}

@Override

public void onNext(Integer integer) {

System.out.println("--> onNext(10): " + integer);

}

@Override

public void onError(Throwable e) {

System.out.println("--> onError(10): " + e);

}

@Override

public void onComplete() {

System.out.println("--> onComplete(10)");

}

});

输出:

----> doOnSubscribe

--> onSubscribe(1)

--> onNext(1): 999

--> onCompleted(1)

--------------------------------------------

----> doOnLifecycle onSubscribe(2)

--> onSubscribe(2)

--> onNext(2): 999

----> doOnLifecycle onDispose(2)

--------------------------------------------

----> doOnNext(3): 999

--> accept(3): 999

--------------------------------------------

--> onSubscribe(4)

----> doOnEach(4) onNext: 999

--> onNext(4): 999

----> doOnEach(4) onComplete

--> onCompleted(4)

--------------------------------------------

--> onNext(5): 999

----> doAfterNext(5): 999

--------------------------------------------

--> onSubscribe(6)

----> doOnError(6): java.lang.Exception: Test Error!

--> onError(6): java.lang.Exception: Test Error!

--------------------------------------------

--> accept(7): 999

----> doOnTerminate(7)

--------------------------------------------

--> onSubscribe(8)

--> onNext(8): 999

----> doOnComplete(8)

--> onComplete(8)

--------------------------------------------

--> onSubscribe(9)

--> onNext(9): 999

--> onComplete(9)

----> doFinally(9)

--------------------------------------------

--> onSubscribe(10)

----> doOnDispose(10)

3. SubscribeOn

指定Observable自身在哪个调度器上执行。

b1e07535baaa65089738a79cf403a839.png

使用调度器 Scheduler 来管理多线程环境中Observable的转场。你可以使用 SubscribeOn 操作符指定Observable在一个特定的调度器上运转。

示例代码:

// 查看当前线程id

System.out.println("----> main: threadID = " + Thread.currentThread().getId());

/**

* subscribeOn(Scheduler scheduler)

* 指定Observable在指定的scheduler上调度

*/

Observable.create(new ObservableOnSubscribe() {

@Override

public void subscribe(ObservableEmitter emitter) throws Exception {

// 查看Observable的工作线程id

System.out.println("----> SubscribeOn: threadID = " + Thread.currentThread().getId());

emitter.onNext(999);

emitter.onComplete();

}

}).subscribeOn(Schedulers.newThread()) // 指定Observable的工作线程在子线程

.subscribe(new Consumer() {

@Override

public void accept(Integer integer) throws Exception {

System.out.println("--> accept: " + integer);

}

});

System.in.read();

输出:

----> main: threadID = 1

----> SubscribeOn: threadID = 13

--> accept: 999

4. ObserverOn

指定一个观察者在哪个调度器上观察这个Observable。

e51bdda490be47e2b20f89182f4bc387.png

使用调度器 Scheduler 来管理多线程环境中Observable的转场。你可以使用 ObserveOn 操作符指定Observable在一个特定的调度器上发送通知给观察者 (调用观察者的onNext, onCompleted , onError 方法)。

示例代码:

// 查看当前线程id

System.out.println("----> main: threadID = " + Thread.currentThread().getId());

/**

* observeOn(Scheduler scheduler,

* boolean delayError, // 可选参数是否延迟异常

* int bufferSize // 指定缓存大小

* )

* 指定观察者在指定的scheduler线程中调度

*/

Observable.just(999).observeOn(Schedulers.newThread(), true, 3)

.subscribe(new Consumer() {

@Override

public void accept(Integer integer) throws Exception {

// 查看观察者的线程id

System.out.println("--> accept ThreadID: " + Thread.currentThread().getId());

System.out.println("--> accept: " + integer);

}

});

System.in.read();

输出:

----> main: threadID = 1

--> accept ThreadID: 13

--> accept: 999

5. Serialize

强制一个Observable连续调用并保证行为正确,其实就是同步事件操作。

886575144cdb75878c10b76ff34256f3.png

一个Observable可以异步调用它的观察者的方法,可能是从不同的线程调用。这可能会让Observable行为不正确,它可能会在某一个 onNext 调用之前尝试调用 onCompleted 或 onError 方法,或者从两个不同的线程同时调用 onNext 方法。使用 Serialize 操作符,你可以纠正这个Observable的行为,保证它的行为是正确的且是同步的。

示例代码:

/**

* serialize()

* 强制一个Observable连续调用(同步)并保证行为正确

*/

Observable.create(new ObservableOnSubscribe() {

@Override

public void subscribe(ObservableEmitter emitter) throws Exception {

// 多线程事件调用

new Thread(new Runnable() {

@Override

public void run() {

for (int i = 0; i < 10; i++) {

emitter.onNext(i + 1);

}

emitter.onComplete();

}

}).start();

// 多线程事件调用

new Thread(new Runnable() {

@Override

public void run() {

for (int i = 100; i < 110; i++) {

emitter.onNext(i + 1);

}

emitter.onComplete();

}

}).start();

}

}).serialize() // 序列化,合法性操作

.subscribe(new Observer() {

@Override

public void onSubscribe(Disposable d) {

System.out.println("--> onSubscribe");

}

@Override

public void onNext(Integer integer) {

System.out.println("--> onNext: " + integer);

}

@Override

public void onError(Throwable e) {

System.out.println("--> onError: " + e);

}

@Override

public void onComplete() {

System.out.println("--> onComplete");

}

});

System.in.read();

输出:

---------------------------------------------

下面是没有使用Serialize()场景,发现不合法的调用

--> onSubscribe

--> onNext: 1

--> onNext: 2

--> onNext: 3

--> onNext: 4

--> onNext: 5

--> onNext: 6

--> onNext: 7

--> onNext: 8

--> onNext: 101

--> onNext: 102

--> onNext: 103

--> onNext: 104

--> onNext: 105

--> onNext: 9

--> onNext: 106

--> onNext: 10

--> onNext: 107

--> onComplete

--> onNext: 108// 不合法的调用

----------------------------------------------

下面是使用Serialize()场景,合法的事件调用

--> onSubscribe

--> onNext: 1

--> onNext: 2

--> onNext: 3

--> onNext: 4

--> onNext: 5

--> onNext: 6

--> onNext: 7

--> onNext: 8

--> onNext: 9

--> onNext: 101

--> onNext: 102

--> onNext: 103

--> onNext: 104

--> onNext: 105

--> onNext: 106

--> onNext: 107

--> onNext: 108

--> onNext: 109

--> onNext: 110

--> onComplete

6. Materialize

Materialize 将数据项和事件通知都当做数据项发射。

50dc0265b3f93ef6ea8d4a5c94b97ed8.png

一个合法的有限的Obversable将调用它的观察者的 onNext 方法零次或多次,然后调用观察者的 onCompleted 或 onError 正好一次。 Materialize 操作符将这一系列调用,包括原来的 onNext 通知和终止通知onCompleted 或 onError 都转换为一个Observable发射的数据序列。

解析: 将来自原始Observable的通知转换为 Notification 对象,然后它返回的Observable会发射这些数据。

示例代码:

/**

* materialize()

* 将来自原始Observable的通知转换为Notification对象,然后它返回的Observable会发射这些数据。

*/

Observable.create(new ObservableOnSubscribe() {

@Override

public void subscribe(ObservableEmitter emitter) throws Exception {

emitter.onNext(1);

emitter.onNext(2);

emitter.onError(new Exception("Test Error!"));

emitter.onComplete();

}

}).materialize()

.subscribe(new Observer>() {

@Override

public void onSubscribe(Disposable d) {

System.out.println("--> onSubscribe");

}

@Override

public void onNext(Notification integerNotification) {

System.out.println("--> onNext: " + integerNotification);

}

@Override

public void onError(Throwable e) {

System.out.println("--> onError: " + e);

}

@Override

public void onComplete() {

System.out.println("--> onComplete");

}

});

输出:

--> onSubscribe

--> onNext: OnNextNotification[1]

--> onNext: OnNextNotification[2]

--> onNext: OnErrorNotification[java.lang.Exception: Test Error!]

--> onComplete

7. Dematerialize

Dematerialize 操作符是 Materialize 的逆向过程,它将 Materialize 转换的结果还原成它原本的形式。

32f320f0fb6eafb46f26967f4ff68429.png

解析: dematerialize 反转这个过程,将原始Observable发射的 Notification 对象还原成Observable的通知。

示例代码:

/**

* dematerialize()

* 过时的方法,在Rxjava:2.2.4中已经被dematerialize(Function> selector)替代

* 将原始Observable发射的 Notification 对象还原成Observable的通知。

*/

Observable.create(new ObservableOnSubscribe() {

@Override

public void subscribe(ObservableEmitter emitter) throws Exception {

emitter.onNext(1);

emitter.onNext(2);

emitter.onError(new Exception("Test Error!"));

emitter.onComplete();

}

}).materialize()

.dematerialize() // 将Notification 对象还原成Observable的通知

.subscribe(new Observer() {

@Override

public void onSubscribe(Disposable d) {

System.out.println("--> onSubscribe(1)");

}

@Override

public void onNext(Object o) {

System.out.println("--> onNext(1): " + o);

}

@Override

public void onError(Throwable e) {

System.out.println("--> onError(1): " + e);

}

@Override

public void onComplete() {

System.out.println("--> onComplete(1)");

}

});

System.out.println("------------------------------------------------");

/**

* dematerialize(Function> selector)

* 将原始Observable发射的 Notification 对象经过一个selector函数处理后,发射一个新的Notification,

* 还原成Observable的通知。

*/

Observable.create(new ObservableOnSubscribe() {

@Override

public void subscribe(ObservableEmitter emitter) throws Exception {

emitter.onNext(1);

emitter.onNext(2);

emitter.onError(new Exception("Test Error!"));

emitter.onComplete();

}

}).materialize()

.dematerialize(new Function, Notification>() {

@Override

public Notification apply(Notification integerNotification) throws Exception {

System.out.println("--> apply(2): " + integerNotification);

return integerNotification;

}

}).subscribe(new Observer() {

@Override

public void onSubscribe(Disposable d) {

System.out.println("--> onSubscribe(2)");

}

@Override

public void onNext(Integer integer) {

System.out.println("--> onNext(2): " + integer);

}

@Override

public void onError(Throwable e) {

System.out.println("--> onError(2): " + e);

}

@Override

public void onComplete() {

System.out.println("--> onComplete(2)");

}

});

输出:

--> onSubscribe(1)

--> onNext(1): 1

--> onNext(1): 2

--> onError(1): java.lang.Exception: Test Error!

------------------------------------------------

--> onSubscribe(2)

--> apply(2): OnNextNotification[1]

--> onNext(2): 1

--> apply(2): OnNextNotification[2]

--> onNext(2): 2

--> apply(2): OnErrorNotification[java.lang.Exception: Test Error!]

--> onError(2): java.lang.Exception: Test Error!

接续:

Rx介绍与讲解及完整目录参考:Rxjava2 介绍与详解实例

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值