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响应式开发(三)进行介绍,不想一篇博客看不完的样子。本人菜鸟 欢迎评论指导 。