写给自己的RxJava -- 基础篇

Rxjava基于观察者模式,一个完整的观察者模式要有三个角色对象:观察者,被观察者,事件。

而且在异步观察者模式中,一般会有三个相关的线程:被观察者线程(事件产生的线程),观察者线程(处理事件的线程),订阅关系产生的线程(一般都是主线程)。

一般情况下,在同步的观察者模式中(或者我们不进行任何线程的切换),事件产生的线程和事件处理线程还有订阅关系发生的线程是同一个线程(这个线程就是订阅关系产生的线程)。

RxJava的观察者模式是一种扩展的观察者模式,一个被观察者可以发送若干的事件,这些事件组成了一个事件队列。我们可以针对每一个事件或者或者整个事件队列进行处理,处理完之后再发送给观察者。

下面来介绍一下Rxjava中这三个角色对象

  • Observer或者Subscriber,这是观察者对象,用来处理事件。

    Observer处理事件有三个方法:onNext(),onCompleted(),onErroronNext()用来处理普通事件,onCompleted()在事件队列已经发送完普通事件的时候来调用,onError()在事件队列发生错误的时候来调用

    onCompleted()onError()是互斥的,事件队列正常发送完普通事件的时候,应该调用onCompleted(),出错的时候应该调用onError()

    Subscriber相比于Observer增加了两个方法,onStat()unsubscribe()

    1. onStart在订阅关系产生,但是还没有发送事件的时候调用,我们可以在这里做一些初始化的工作。但是要注意,onStart方法的线程是在订阅关系产生的线程,也就是说如果订阅关系是在主线程产生的,onStart就工作在主线程中,如果订阅关系是在工作线程产生的,那么onStart就工作在工作线程。

      如果我们对于初始化的线程有要求,比如要求初始化必须在主线程进行,那么我们可以使用doOnSubscribe()方法,该方法也是在订阅关系产生但是还没有发送事件的时候调用,但是该方法可以指定自己要运行在哪一个线程中。

    2. unsubscribe()该方法是Subscription接口的方法,该接口是对 订阅关系 的一个抽象,代表了一个订阅关系,Subscriber实现了这个接口,并且在subscribe()方法中返回了这个接口,借助这个接口,当我们不在需要订阅被观察者的时候,可以通过该接口的unsubscribe方法解除订阅关系,从而防止内存泄漏。

  • Observable 被观察者对象,用来产生并发送事件

  • 事件对象,我们在创建被观察者对象的时候,要指定被观察者能够产生什么样子的事件,也就是事件的类型

接下来看一下如何产生观察者对象和被观察者对象

  • 观察者对象的生成

    正常的new方法来生成观察者对象

    Subscriber subscriber = new Subscriber(String s){  
      @Override
      public void onNext(String s){
          
      }
      
      @Override
      public void onCompleted(){
          
      }
      
      @Override
      public void onError(Throwable e){
          
      }
    }
    

这就生成了一个观察者对象,该观察者感兴趣的事件类型是String

  • 被观察者对象的生成

    Rxjava提了了几个不同的方法来方便我们生成被观察者对象

    1. Observable.create静态方法

      Observable observable = Observable.create(new Observable.OnSubscribe(){
        @Override
        public void call(Subscriber subscriber){
          subscriber.onNext("hello");
          subscriber.onNext("world");
          subscriber.onCompleted();
        }
      });
      

      Observable.create方法接受Observable的内部类Onsubscribe作为参数,并把该OnSubscriber存储起来,当订阅关系真正发生的时候,通过OnSubscriber来调用观察者的对应方法,实现消息的发送。

      (Observable为什么不直接存储Subscriber的引用?因为这个时候订阅关系还没有真正发生,拿不到啊)

    2. Observable.just(T...)

      just静态方法,通过传入一系列的事件对象T来生成一个Observable对象,当订阅关系发生的时候,就把一系列的事件对象发送到Subscriber的onNext方法中

    3. Observable.from(Iterator it)

      from静态方法,通过传入一个迭代器,把迭代器中的内容作为一系列的事件对象,从而生成一个Observable对象,当订阅关系发生的时候,把迭代器中的内容作为事件发送给Subscriber的onNext方法。

  • 订阅关系的产生

    通过observable.subscribe(subscriber)来发生订阅关系

那我们看一下在发生关系的时候都做了哪些事情,引用 扔物线中的一段代码

public Subscription subscribe(Subscribe subscribe){
    subscribe.onStart();
    onSubscribe.call(subscribe);
    return subscribe;
}

所以,还记得我们说Subscriber实现了Subscription接口,以方便在将来unsubscribe吗?

还记得前面我们说Subscriber的onStart方法在 订阅关系 产生的线程中执行吗?

还记得我们Observable的静态方法create()需要传入一个OnSubscribe对象作为参数吗?

通过这段代码就都清楚了。

还有什么的要说的吗?

就是我们每次在发生订阅关系的时候,都需要一个被观察者和一个观察者,而观察者一般都要实现onNext ,onCompleted,onError这三个方法,我们在开发中一般并不是三个方法都关心,比如只关心onNext方法,RxJava给我们提供了subscribe方法的几个重载版本,来使我们更方便的实现订阅。

比如

observable.subscribe(new Action1<String>(){
  @Override
  public void call(String s){
      
  }  
});

先说一下ActionX<T>接口,这个接口有一个方法call(),X为N,则call方法就有N个参数,并且ActionX的call方法是没有返回值的。

比如Action1<String>就说明call方法有一个参数,该参数的类型是String。而onNext方法也是无返回值,也是只有一个参数,所以在上面的代码中,RxJava就会帮助我们生成一个Subscriber,并且在这个为我们生成的Subscriber的onNext方法中,调用这个Action1的call方法。类似于Python中的闭包。

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

推荐阅读更多精彩内容