美文网首页移动开发前线AndroidAndroid技术知识
Rxjava梳理(1)--Observable,Observer

Rxjava梳理(1)--Observable,Observer

作者: 小7 | 来源:发表于2015-10-28 23:42 被阅读3170次

    最近在研究Rxjava,也希望能自己的一些输入梳理出来,帮助自己形成一个体系吧。话说自己第一次认识Rxjava还是参加了一次Thoughtworks组织的一次分享上。当时的第一印象就是Rxjava跟我们一般的写程序的思路确实有些不同,需要花些时间消化。现在就开始梳理自己对Rxjava的理解。

    不管学什么东西,第一步先要了解它的概念:“A library for composing asynchronous and event-based programs by using observable sequences.”这句话的意思是Rxjava是一个利用监听者模式构成了异步的并且事件驱动的程序。什么意思呢?先从监听者模式开始说起吧。相信大家对监听者模式并不算陌生吧,当对象A对对象B感兴趣的话,会让对象B注册自己并告诉它:“我对你很感兴趣,请你在XXX状态改变的时候或者是引发XXX事件的时候通知我”。Android中最常见的一个例子就是View.setOnClickListener() 方法,对该视图控件感兴趣的对象会实现OnClickListener这个接口并要求该控件注册自己。这样只要这个空间有了点击事件发生,这个对象用来监听的回调方法就会被调用。

    Rxjava则是对观察者模式的一个高度的抽象,它包括两个非常重要的类:Observable(被观察者)和Observer(观察者),而这两个类的对象之间是通过subscribe()方法来建立订阅关系的连接。

    先来看看Observer的的代码:
    <code>
    public interface Observer<T>{
    public void onNext(T t);
    public void onCompleted();
    public void onError(Throwable e);
    }
    </code>
    其中onNext()方法类似onClick()方法用来供观察者处理事件,而onCompleted()方法是被观察者用来告诉观察者:“我传给你的事件已经都传完了,你可以做你的事情了”,onError()方法是被观察者告诉观察者:"我在给你传事件的时候出错了,去看一看吧"。由此可以看出来一个Observer对象对一次订阅只可能调用onCompleted()和onError()方法的其中一个,而不可能两个方法都调用。

    下面来看看如果生成Observable对象吧。最原始的一个方法是Observable.create(OnSubscribe<T> onSubscribe),该方法中的参数OnSubscribe是一个接口,该接口的方法如下:
    <code>
    public void call(Subscriber<? super T> subscriber);
    </code>
    类Subscriber是Observer的子类,这样就不难猜到观察者里的调用逻辑就是在OnSubscribe里的call方法定义的。通过Observable.create()方法也就衍生出了一系列的更加方便的生成Observable对象的方法。比如Observable.just("1","2","3")方法就相当于在OnSubscribe对象里的call方法是这样实现的:
    <code>
    subscriber.next("1");
    subscriber.next("2");
    subscriber.next("3");
    subscriber.onCompleted();
    </code>

    当Observable对象和Observer对象都有了的时候就要靠subscribe()方法把两者连接起来:Observable.subscribe(Subscriber),可见subscribe方法的参数是Subscriber类,在该类中除了含有Observer接口的那几个方法外还有两个方法:

    1. onStart():它是在subscribe()发生后,事件发生前调用的,用来做一些准备工作
    2. unsubscribe():它表示取消订阅,也就是说它调用后Subscriber对象不再接收传过来的事件。当然它还有一个更重要的作用就是释放掉Observable的引用,以避免内存泄漏的威胁。

    以上就是关于Rxjava中最基本的一些概念的梳理,以后还会继续,现在关于Rxjava的教程文档并不算多,所以我自己也在学习阶段,希望能和更多的朋友进行交流。

    相关文章

      网友评论

      • Hancock1993:.subscribe()里面现在不能传Subscriber了吗? 我看Subscriber现在在org.reactivestreams包下,而observer则在io.reactivex包下.(还是说我引用的包不对吗?
        compile 'io.reactivex.rxjava2:rxjava:2.1.0'
        compile 'io.reactivex.rxjava2:rxandroid:2.0.1')
        38ee95b2bd0c:我也是这个问题 你解决了吗?
      • alighters:个人感觉啊,是不应该先学java8的函数式表达式,再了解RxJava。不知道楼主怎么看?
        小7:@david_wei 不需要哈,我都没有看过函数式表达式也不影响我看rxjava啊
      • LostAbaddon:代码块的用法错了哦,应该是这样的:
        ```code-lang
        blablabla
        ```
        小7:@塔塔酱 好的,谢谢提醒
      • Android开发:android的适配器模式也是这么个原理吧
        Android开发:@小7 EventBus视乎也是这样的原理吧。我很想研究Rx,最近好像很火,可是没有时间 :grin:
        Android开发:@小7 那不都是观察者模式?
        小7: @Android开发 不一样哦,两种模式解决的问题不同,适配器模式解决的是重用原有的代码适应新接口的问题,观察者模式解决的是及时响应自己感兴趣的对象状态改变的问题

      本文标题:Rxjava梳理(1)--Observable,Observer

      本文链接:https://www.haomeiwen.com/subject/iesxhttx.html