RxJava观察者模式
RxJava 有四个基本概念:1、Observable (可观察者,即被观察者);2、 Observer (观察者);3、 subscribe (订阅);4、事件。
Observable 和 Observer 通过 subscribe() 方法实现订阅关系,从而 Observable 可以在需要的时候发出事件来通知 Observer。
代码实现:
创建观察者
Observer 即观察者,它决定事件触发的时候将有怎样的行为。Observer是一个接口。
Observer<String> observer = new Observer<String>() { @Override public void onNext(String s) {
Log.i(TAG, "onNext: "); } @Override public void onCompleted() {
Log.i(TAG, "onCompleted: "); } @Override public void onError(Throwable e) {
Log.i(TAG, "onError: "); }
};RxJava中除了Observer接口,还有实现了Observer接口的抽象类Subscriber。Subscriber 对 Observer 接口进行了一些扩展,但他们的基本使用方式是完全一样的:
Subscriber<String> showsub = new Subscriber<String>() { /** * 没有错误,正常完成 */ @Override public void onCompleted() {
Log.i(TAG, "onCompleted: "); } /** * 遇到错误调用 * 同时会终止observable,不再调用onNext和onCompleted * @param e */ @Override public void onError(Throwable e) {
Log.i(TAG, "onError: " + e.getMessage()); } /** * 发射数据 * @param s */ @Override public void onNext(String s) {
Log.i(TAG, "onNext: " + s); }
};创建被观察者
Observable 即被观察者,它决定什么时候触发事件以及触发怎样的事件。 RxJava 使用 create() 方法来创建一个 Observable ,并
为它定义事件触发规则:
//创建被观察者Observable<String> observable = Observable.create(new Observable.OnSubscribe<String>() { @Override public void call(Subscriber<? super String> subscriber) { //订阅关系 if (!subscriber.isUnsubscribed()) {
subscriber.onNext("hello"); subscriber.onNext("World"); subscriber.onNext(downloadJson()); subscriber.onCompleted(); }
}
});public static String downloadJson() { return "json data";}实现订阅关系
创建了 Observable 和 Observer(Subscriber) 之后,再用 subscribe() 方法将它们联结起来,代码很简单
//关联被观察者observable.subscribe(showsub);
到此为止就实现了RxJava的观察者模式,但是Observable和Subscriber是分开实现订阅关系的,他们还可以这样写,代码如下:
Observable.create(new Observable.OnSubscribe<Integer>() { @Override public void call(Subscriber<? super Integer> subscriber) { for (int i = 0; i < 10; i++) {
subscriber.onNext(i); }
subscriber.onCompleted(); }
}).subscribe(new Subscriber<Integer>() { @Override public void onCompleted() {
Log.i(TAG, "onCompleted: "); } @Override public void onError(Throwable e) {
Log.i(TAG, "onError:"); } @Override public void onNext(Integer integer) {
Log.i(TAG, "onNext: " + integer); }
});这样看起来是不是更加的清晰明了了。
RxJava实例使用先说到这,他们的关系以及API原理详解在 RxAndroid响应式开发(三)进行介绍,不想一篇博客看不完的样子。本人菜鸟 欢迎评论指导 。