一、何为RxJava
二、RxJava——扩展的观察者模式
与常规观察者模式有所不同,主要特点如下:
- Observer与Observable是通过subscrible()来达成订阅关系。
- Rxjava中的事件回调有三种:onNext()、onCompleted()、onError()。
- 如果一个Observable没有任何的Observer,那么这个Observable是不会发出任何事件的。
RxJava观察者模式原理图:
三、实现原理
(1)观察者(Observer、Subscriber)
Observer是一个接口,提供了3个方法:onNext(T t)
, onError(Throwable e)
, onCompleted()
。
Subscriber是Observer的子类,class Subscriber<T> implements Observer<T>, Subscription
。
Subscriber在Observer的基础上有如下扩展:
-
增加了
onStart()
。这个方法在观察者和被观察者建立订阅关系后,而被观察者向观察者发送消息前调用,主要用于做一些初始化工作,如数据的清零或重置。 -
增加了
unsubscribe()
。这个方法用于取消订阅,若isUnsubscribed()
为true,则观察者不能收到被观察者的消息。
创建一个Observer:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 Observer<String> observer = new Observer<String>() { 2 @Override 3 public void onCompleted() { 4 Log.d(TAG, "onCompleted"); 5 } 6 7 @Override 8 public void onError(Throwable e) { 9 Log.d(TAG, "onError" + e); 10 } 11 12 @Override 13 public void onNext(String s) { 14 Log.d(TAG, "onNext -> " + s); 15 } 16 };
创建一个Subscriber:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 Subscriber<String> subscriber = new Subscriber<String>() { 2 @Override 3 public void onCompleted() { 4 Log.d(TAG, "onCompleted"); 5 } 6 7 @Override 8 public void onError(Throwable e) { 9 Log.d(TAG, "onError" + e); 10 } 11 12 @Override 13 public void onNext(String s) { 14 Log.d(TAG, "onNext -> " + s); 15 } 16 };
(2)被观察者(Observable)
Observable决定什么时候触发事件以及触发怎样的事件。常见的3种创建Observable的方式:
1 、Observable.create(Observable.OnSubscribe)
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 Observable<String> observable = Observable.create(new Observable.OnSubscribe<String>() { 2 @Override 3 public void call(Subscriber<? super String> subscriber) { 4 subscriber.onNext("message 1"); 5 subscriber.onNext("message 2"); 6 subscriber.onCompleted(); 7 } 8 });
当Observable
与Observer/Subscriber
建立订阅关系的时候,call()
会被调用。
2、 Observable.just(T...)
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 Observable<String> observable1 = Observable.just("message 1", "message 2");
这个方法可以传1-N个类型相同的参数,和上面的例子等价。最终也会调用Observeber/Subscriber
的onNext("message 1")
, onNext("message 2")
, onCompleted()
。
3、 Observable.from(T[])
, Observable.from(Iterable<? extends T>)
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 String[] array = {"message 1", "message 2"}; 2 Observable<String> observable2 = Observable.from(array);
这个方法可以传数组或Iterable,和上面的例子等价。
(3)订阅(Subscription)
订阅关系建立有2种方式:1.Observable.subscribe(Subscriber)
; 2.Observable.subscribe(Action)
Observable
和Observer/Subscriber
通过Observable.subscribe(Subscriber)
建立订阅关系,实现如下:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 public Subscription subscribe(Subscriber subscriber) { 2 subscriber.onStart(); 3 onSubscribe.call(subscriber); 4 return subscriber; 5 }
当订阅关系建立时,首先调用subscriber的onStart()
方法,此处可进行一些初始化操作,如数据清零或重置。 接着调用onSubscribe.call(subscriber)
,此处就是创建Observable
时Observable.create(OnSubscribe)
传入的OnSubscribe
参数。
Action
这种方式,里面实现也还是用Subscriber进行了包装,本质上就是上面Subscriber的那种方式。只不过根据传入的参数不同回调的方法不同而已。
关于Subscription
这个接口,这个类提供了两个方法unsubscribe()
和isUnsubscribed()
,可以解除订阅关系和判断订阅关系。subscribe()订阅方法的返回值也是Subscription
。
四、使用观察者模式的好处
1、观察者模式在被观察者和观察者之间建立一个抽象的耦合,可以属于不同的抽象化层次。
2、观察者模式支持广播通信。被观察者会向所有的登记过的观察者发出通知。
Observer.java:https://github.com/ReactiveX/RxJava/blob/0e7b8eaa61f9cac0538ef6a59bfbd0b119b87732/src/main/java/io/reactivex/Observer.java#L76
Subscriber:https://github.com/ReactiveX/RxJava/tree/2.x/src/main/java/io/reactivex/internal/subscribers
Observable:https://github.com/ReactiveX/RxJava/tree/2.x/src/main/java/io/reactivex/internal/operators/observable