写给自己的RxJava -- 基础篇

2017-10-26  本文已影响0人  董成鹏

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

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

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

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

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

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

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

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

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中的闭包。

上一篇 下一篇

猜你喜欢

热点阅读