RxJava 源码阅读笔记(一) 观察者模式

1.什么是Rxjava

 作者给他的概括是"a library for composing asynchronous and event-based programs using observable sequences for the Java VM"(一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库),通俗来讲就是一个采用观察者模式设计的响应式编程框架,灵魂在于他所拓展的观察者模式和异步操作。

2.什么是观察者模式

一般而言,实现对一组数据的实时监控,常用的有两种方式,一种采用setListener这样的回调机制,另一种则是写一个轮询2秒钟去查看一下这组数据是否变化。但,其实还有另一种方式即观察者模式,观察者模式强调当被观察者数据改变时,被观察者会告知观察者,然后进行你想要的操作。实现如下:

1.新建被观察者接口:

public interface Observerable {
    public void registerObserver(Observer o);
    public void removeObserver(Observer o);
    public void notifyObservers();
}

2.新建观察者接口:

public interface Observer {
    public void update(int edition,float cost);
}

3.实现被观察者接口:

public class MagazineData implements Observerable {

    private List<Observer> mObservers;
    private int edition;
    private float cost;

    public MagazineData() {
        mObservers = new ArrayList<>();
    }

    @Override
    public void registerObserver(Observer o) {
        mObservers.add(o);
    }

    @Override
    public void removeObserver(Observer o) {
        int i = mObservers.indexOf(o);
        if(i >= 0)
            mObservers.remove(i);
    }

    @Override
    public void notifyObservers() {
        for(int i = 0; i < mObservers.size(); i++){
            Observer observer = mObservers.get(i);
            observer.update(edition, cost);
        }
    }

    public void setInfomation(int edition,float cost){
        this.edition = edition;
        this.cost = cost;
        //信息更新完毕,通知所有观察者
        notifyObservers();
    }

}

4.实现观察者接口:

public class Customer implements Observer {

    private String name;
    private int edition;
    private float cost;

    public Customer(String name){
        this.name = name;
    }

    @Override
    public void update(int edition, float cost) {
        this.edition = edition;
        this.cost = cost;
        buy();
    }

    public void buy(){
        System.out.println(name+"购买了第"+edition+"期的杂志,花费了"+cost+"元。");
    }

}

5.代码实现:

public class Test { public static void main(String[] args) {
        //创建被观察者
        MagazineData magazine = new MagazineData();
        //创建观察者
        Observer customerA = new Customer("A");

        //将观察者注册到被观察者中
        magazine.registerObserver(customerA);

        //更新被观察者中的数据,当数据更新后,会自动通知所有已注册的观察者
        magazine.setInfomation(5, 12);
    }

}

3.观察者Observer类介绍

1.Observer的创建:

Observer有两种创建方式一种是:

Observer observer = new Observer() {

         @Override

          public void onCompleted() {

          //onCompleted在没有onNext方法后调用 调用后事件队列的完成

          }

          @Override

           public void onError(Throwable e) {

          //onError在处理事件中发生意外时调用 调用后事件队列的完成

           }

           @Override

            public void onNext(String s) {

            //onNext用来发送事件

            }

};

第二种是:

Subscriber subscriber =new Subscriber() {

                @Override

                 public void onStart() {

                //在队列运行前进行数据的初始化,不包括UI部分

                 }

                 @Override

                  public void onCompleted() {

                  }

                  @Override

                  public void onError(Throwable e) {

                  }

                  @Override

                  public void onNext(String s) {

                  }

};

5.被观察者Observable类介绍*

1.创建被观察者

Observable<string> Observable= Observable.create(newObservable.OnSubscribe() {

@Override

public void call(Subscriber subscriber) {

            subscriber.onNext("Hello");

            subscriber.onNext("World");

            subscriber.onCompleted();

            }

}); 

2.订阅观察者

Observable.subscribe(observer);

调用订阅后观察者就会根据被观察者call里的情况调用相应的方法

这里看一下subscribe的源码

public final Subscription subscribe(final Observer observer) {

           if(observer instanceof Subscriber) {

                      return subscribe((Subscriber)observer);

           }

           return subscribe(new Observer<T> Subscriber(observer));

}

简单来说就是如果传过来的是个Observer类就会把它转化成Subscriber类,然后subscribe是什么呢?

static Subscription subscribe(Subscriber subscriber, Observable observable) {

              if (subscriber == null) {

                  throw new IllegalArgumentException("subscriber can not be null");

              }

               if (observable.onSubscribe == null) {

                   throw new IllegalStateException("onSubscribe function can not be null.");

               }

                //先调用onStart进行数据初始化

                subscriber.onStart();

                if (!(subscriber instanceof SafeSubscriber)) {

                //目测是确保onError与onCompletedliang两个方法调用后禁止调用其他方法

                     subscriber = new SafeSubscriber(subscriber);

                 }

                 try {

                        hook.onSubscribeStart(observable,               observable.onSubscribe).call(subscriber);

                       return hook.onSubscribeReturn(subscriber);

                  } catch (Throwable e) {

                          //catch内容先别管

                  }

                   return Subscriptions.unsubscribed();

   }


然后是try里的这两句

hook.onSubscribeStart(observable,observable.onSubscribe).call(subscriber);

return hook.onSubscribeReturn(subscriber);

发现hook.onSubscribeStart(observable,observable.onSubscribe)返回一个onSubscribe,

hook.onSubscribeReturn(subscriber)返回一个subscription所以可以简化为

onSubscribe.call(subscriber);

return subscription;

而这个call就是你new Observable时重写的方法。总结一下就是这部分的代码相当于最基础的观察者模式中的

magazine.registerObserver(customerA);

注册订阅部分,而新建观察者和被观察者的代码相当于之前实现接口的代码


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,837评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,551评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,417评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,448评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,524评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,554评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,569评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,316评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,766评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,077评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,240评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,912评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,560评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,176评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,425评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,114评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,114评论 2 352

推荐阅读更多精彩内容