必做作业三:观察者模式在RxJava中的应用

一、何为RxJava

RxJava中文文档

github地址

二、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的基础上有如下扩展:

  1. 增加了onStart()。这个方法在观察者和被观察者建立订阅关系后,而被观察者向观察者发送消息前调用,主要用于做一些初始化工作,如数据的清零或重置。

  2. 增加了unsubscribe()。这个方法用于取消订阅,若isUnsubscribed()为true,则观察者不能收到被观察者的消息。

创建一个Observer:

 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 };
View Code

 

创建一个Subscriber:

 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 };
View Code

 

(2)被观察者(Observable)

Observable决定什么时候触发事件以及触发怎样的事件。常见的3种创建Observable的方式:

1 、Observable.create(Observable.OnSubscribe)

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     });
View Code

 

ObservableObserver/Subscriber建立订阅关系的时候,call()会被调用。

2、 Observable.just(T...)

1  Observable<String> observable1 = Observable.just("message 1", "message 2");
View Code

 

这个方法可以传1-N个类型相同的参数,和上面的例子等价。最终也会调用Observeber/SubscriberonNext("message 1")onNext("message 2")onCompleted()

3、 Observable.from(T[])Observable.from(Iterable<? extends T>)

1     String[] array = {"message 1", "message 2"};
2     Observable<String> observable2 = Observable.from(array);
View Code

 

这个方法可以传数组或Iterable,和上面的例子等价。

(3)订阅(Subscription)

订阅关系建立有2种方式:1.Observable.subscribe(Subscriber); 2.Observable.subscribe(Action)

ObservableObserver/Subscriber通过Observable.subscribe(Subscriber)建立订阅关系,实现如下:

1 public Subscription subscribe(Subscriber subscriber) {
2     subscriber.onStart();
3     onSubscribe.call(subscriber);
4     return subscriber;
5 }
View Code

 

当订阅关系建立时,首先调用subscriber的onStart()方法,此处可进行一些初始化操作,如数据清零或重置。 接着调用onSubscribe.call(subscriber),此处就是创建ObservableObservable.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

转载于:https://www.cnblogs.com/zhangjiekai/p/9822638.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值