美文网首页
Rxjava到底是什么?

Rxjava到底是什么?

作者: IT烟酒僧 | 来源:发表于2018-07-18 09:20 被阅读474次

    Rxjava到底是什么?

    异步:一个在java vm上使用可观测的序列来组成异步的,基于事件的程序的库

    1. 观察者模式

    观察者通过注册(register)或者订阅(subscribe)的方式,告诉被观察者
    rxjava有四个基本概念:
    onservable(被观察者)
    observer(观察者)
    subscribe(订阅)
    事件
    观察者和被观察者通过subscribe()方法实现订阅关系,从而observable可以在需要的时候发出事件通知observer

    三个方法

    oncompleted():事件队列完结,Rxjava不仅把每个事件单独处理,还会把他们看作一个队列,rxjava规定,当不会再有新的onnext()发出时,需要出发oncompleted()方法作为标志
    onNext()发出时,需要触发onCompleted()方法作为标志
    onError()事件队列异常,触发时队列自动终止,不允许再有事件发出
    在一个正确运行的事件序列中,onComplete()和onError()有且只有一个,并且是事件序列中的最后一个,需要注意的是,onComplete()和onError()二者之间是互斥的,即在队列中调用了其中一个,就不应该再调用另一个.

    基本实现

    1 创建Observer

    Observer即观察者,它决定事件触发的时候将有怎样的行为,Rxjava中的Observer接口实现方式
    Observer<String> observer = new Observer<String>() {
       @Override
       public void onNext(String s) {
           Log.d(tag, "Item: " + s);
       }
       
       @Override
       public void onCompleted() {
           Log.d(tag, "Completed!");
       }
       
       @Override
       public void onError(Throwable e) {
           Log.d(tag, "Error!");
       }
     };
    
    除了Observer接口外,Rxjava还内置了一个实现了Observer的抽象类:Subscriber对Observer接口进行了一些扩展,但他们的基本使用方法时完全一样的
    Subscriber<String> subscriber = new Subscriber<String>() {
    @Override
    public void onNext(String s) {
        Log.d(tag, "Item: " + s);
    }
    
    @Override
    public void onCompleted() {
        Log.d(tag, "Completed!");
    }
    
    @Override
    public void onError(Throwable e) {
        Log.d(tag, "Error!");
    }
    };
    
    不仅基本使用方式一样,实质上,在 RxJava 的 subscribe 过程中,Observer 也总是会先被转换成一个 Subscriber 再使用。所以如果你只想使用基本功能,选择 Observer 和 Subscriber 是完全一样的。它们的区别对于使用者来说主要有两点:
    1onStart(): 这是 Subscriber 增加的方法。它会在 subscribe 刚开始,而事件还未发送之前被调用,可以用于做一些准备工作,例如数据的清零或重置。这是一个可选方法,默认情况下它的实现为空。需要注意的是,如果对准备工作的线程有要求(例如弹出一个显示进度的对话框,这必须在主线程执行), onStart() 就不适用了,因为它总是在 subscribe 所发生的线程被调用,而不能指定线程。要在指定的线程来做准备工作,可以使用 doOnSubscribe() 方法,具体可以在后面的文中看到。
    1unsubscribe(): 这是 Subscriber 所实现的另一个接口 Subscription 的方法,用于取消订阅。在这个方法被调用后,Subscriber 将不再接收事件。一般在这个方法调用前,可以使用
    2 isUnsubscribed() 先判断一下状态。 unsubscribe() 这个方法很重要,因为在 subscribe() 之后, Observable 会持有 Subscriber 的引用,这个引用如果不能及时被释放,将有内存泄露的风险。所以最好保持一个原则:要在不再使用的时候尽快在合适的地方(例如 onPause() onStop() 等方法中)调用 unsubscribe() 来解除引用关系,以避免内存泄露的发生。

    2 创建 Observerable

    Observerable 即被观察者,它决定什么时候触发事件以及触发什么事件,Rxjava使用create()方法来创建一个Observerable,并为他定义事件触发规则:

    Observable observable = Observable.create(new Observable.OnSubscribe<String>() {
    @Override
    public void call(Subscriber<? super String> subscriber) {
        subscriber.onNext("Hello");
        subscriber.onNext("Hi");
        subscriber.onNext("Aloha");
        subscriber.onCompleted();
    }
    });
    
    可以看到,这里传入了一个 OnSubscribe 对象作为参数。OnSubscribe 会被存储在返回的 Observable 对象中,它的作用相当于一个计划表,当 Observable 被订阅的时候,OnSubscribe 的 call() 方法会自动被调用,事件序列就会依照设定依次触发(对于上面的代码,就是观察者Subscriber 将会被调用三次 onNext() 和一次 onCompleted())。这样,由被观察者调用了观察者的回调方法,就实现了由被观察者向观察者的事件传递,即观察者模式。

    3 Subscribe订阅

    创建了Observerable和Observer之后,再用subscribe()方法将它们联结起来,整条链子就可以工作了
    observable.subscribe(observer);
    // 或者:
    observable.subscribe(subscriber);

    相关文章

      网友评论

          本文标题:Rxjava到底是什么?

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