RxJava(一)

前言

去年开始,我负责企业整个Android项目,到现在一年了,在项目开始的时候,我选择了目前流行的MVP+RxJava+Retrofit的结构框架。后面我陆续写一些总结,今天先从RxJava写起吧。

RxJava是什么

"a library for composing asynchronous and event-based programs using observable sequences for the Java VM"(一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库),这是RxJava在GitHub主页的描述。嗯~~~就是一个异步的库,基于观察者模式,不知道我这样解释可以吗:)

那么就要说到什么是观察者模式了。

观察者模式(Observer)完美的将观察者和被观察的对象分离开。举个例子,用户界面可以作为一个观察者,业务数据是被观察者,用户界面观察业务数据的变化,发现数据变化后,就显示在界面上。面向对象设计的一个原则是:系统中的每个类将重点放在某一个功能上,而不是其他方面。一个对象只做一件事情,并且将他做好。

观察者模式有很多实现方式,从根本上说,该模式必须包含两个角色:观察者和被观察对象。在刚才的例子中,业务数据是被观察对象,用户界面是观察者。观察者和被观察者之间存在“观察”的逻辑关联,当被观察者发生改变的时候,观察者就会观察到这样的变化,并且做出相应的响应。如果在用户界面、业务数据之间使用这样的观察过程,可以确保界面和数据之间划清界限,假定应用程序的需求发生变化,需要修改界面的表现,只需要重新构建一个用户界面,业务数据不需要发生变化。

其实Android的监听OnClickListener,就是典型的观察者,View是被观察者。

RxJava观察者模式

RxJava 有四个基本概念:Observable (可观察者,即被观察者)、Observer (观察者)、subscribe (订阅)、事件。Observable和Observer通过subscribe()方法实现订阅关系,从而Observable可以在需要的时候发出事件来通知Observer。
RxJava的事件回调方法有onNext(),onCompleted() 和 onError()。
- onCompleted():事件队列完结。RxJava不仅把每个事件单独处理,还会把它们看做一个队列RxJava规定,当不会再有新的onNext()发出时,需要触发 onCompleted()方法作为标志。
- onError():事件队列异常。在事件处理过程中出异常时onError()会被触发,同时队列自动终止,不允许再有事件发出。
- 注意:在一个正常的事件队列中,onCompleted()和onError()只有一个会被触发,同时,队列自动终止。

怎么使用RxJava

RxJava基本操作有以下几个步骤:

1. 创建Observer:

Observer 即观察者,它决定触发事件的行为。
RxJava 中的 Observer 接口的实现方式:

Observer<String> observer = new Observer<String>() {
    @Override
    public void onNext(String s) {
        Log.i(tag, "Item: " + s);
    }

    @Override
    public void onCompleted() {
        Log.i(tag, "Completed");
    }

    @Override
    public void onError(Throwable e) {
        Log.i(tag, "Error");
    }
};

除了 Observer 接口之外,RxJava 还内置了一个实现了 Observer 的抽象类:Subscriber。 Subscriber 对 Observer 接口进行了一些扩展,但他们的基本使用方式是完全一样的:

Subscriber<String> subscriber = new Subscriber<String>() {
    @Override
    public void onNext(String s) {
        Log.i(tag, "Item: " + s);
    }

    @Override
    public void onCompleted() {
        Log.i(tag, "Completed");
    }

    @Override
    public void onError(Throwable e) {
        Log.i(tag, "Error");
    }
};

如果只考虑基本功能,Observer和Subscriber都一样。它们的区别对于使用者来说主要有两点:
1. onStart():这是Subscriber怎加的方法。他会在Subscriber刚开始,事件队列开始前调用。
2. unsubscribe():这是 Subscriber 所实现的另一个接口 Subscription 的方法,用于取消订阅。

2. 创建 Observable:

Observable 即被观察者,它决定什么时候触发事件以及触发怎样的事件。RxJava 使用create()来创建一个Observable:

Observable observable = Observable.create(new Observable.OnSubscribe<String>() {
    @Override
    public void call(Subscriber<? super String> subscriber) {
        subscriber.onNext("Hello");
        subscriber.onNext("Hi");
        subscriber.onNext("Yo");
        subscriber.onCompleted();
    }
});

这里传入一个OnSubscribe对象。当Observable被订阅的时候,OnSubscribe的call()会被调用,事件序列就会依次触发。这样,由被观察者调用了观察者的回调方法,就实现了由被观察者向观察者的事件传递,即观察者模式。
create()是RxJava最基本的创造事件序列的方法。RxJava还提供了一些其他方法用来创建事件队列:
- just(T…): 将传入的参数依次发送出来。

Observable observable = Observable.just("Hello", "Hi", "Yo");
// 将会依次调用:
// onNext("Hello");
// onNext("Hi");
// onNext("Yo");
// onCompleted();
  • from(T[]) / from(Iterable
String[] st = {"Hello", "Hi", "Yo"};
Observable observable = Observable.from(st);
// 将会依次调用:
// onNext("Hello");
// onNext("Hi");
// onNext("Yo");
// onCompleted();
3. Subscribe (订阅)

创建了Observable和Observer之后,再用subscribe()方法将它们联结起来:

observable.subscribe(observer);
// 或者:
observable.subscribe(subscriber);
发布了13 篇原创文章 · 获赞 3 · 访问量 9012

猜你喜欢

转载自blog.csdn.net/u012987393/article/details/82664640