-
RxJava是什么
官网是上这样解释的,一个在java vm上使用可观测的序列来组成异步的,基于事件的程序的库。
-
Rxjava主要作用
Rxjava主要作用就是用来处理异步,当你的业务需要访问数据库,访问网络,或者任何耗时的操作,都可以借助Rxjava来实现。
-
什么是观察者模式
观察者模式(Observer Pattern)定义了对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新,观察者模式又叫做发布-订阅(Publish/Subscribe)模式。
-
处理异步任务可以用Handler,AsyncTask等来实现,我们为什么还要用Rxjava?
- 采用链式调用,代码简洁优雅有美感,并且可读性增强。
- rxjava中采用观察者模式。模块之间划定了清晰的界限,降低了模块间的耦合性,提高了代码的可维护性和重用性。
- rxjava中提供了强大的操作符。
-
RxJava 的观察者模式
- RxJava 有四个基本概念:
1、Observable (可观察者,即被观察者)、
2、Observer (观察者)、
3、subscribe (订阅)、事件。
4、Observable 和 Observer 通过 subscribe() 方法实现订阅关系,从而 Observable 可以在需要的时候发出事件来通知 Observer。 - 与传统观察者模式不同, RxJava 的事件回调方法除了普通事件 onNext() (相当于 onClick() / onEvent())之外,还定义了两个特殊的事件:onCompleted() 和 onError()。
onCompleted(): 事件队列完结。RxJava 不仅把每个事件单独处理,还会把它们看做一个队列。RxJava 规定,当不会再有新的onNext()发出时,需要触发onCompleted()方法作为标志。
onError(): 事件队列异常。在事件处理过程中出异常时,onError()
会被触发,同时队列自动终止,不允许再有事件发出。
在一个正确运行的事件序列中,onCompleted()和onError()有且只有一个,并且是事件序列中的最后一个。需要注意的是,onCompleted()
和onError()二者也是互斥的,即在队列中调用了其中一个,就不应该再调用另一个。
- 被观察者
Observable 即被观察者,它决定什么时候触发事件以及触发怎样的事件。可以使用create()、just(T...)、from(T[])或from(Iterable<? extends T>)来创建一个 Observable ,并为它定义事件触发规则。 - 订阅
创建了Observable和Observer之后,再用subscribe()方法将它们联结起来
使用
//创建一个观察者
Observer<String> observer = new Observer<String>() {
@Override
public void onCompleted() {
Log.i(TAG, "Completed");
}
@Override
public void onError(Throwable e) {
Log.i(TAG, "Error");
}
@Override
public void onNext(String s) {
Log.i(TAG, s);
}
};
//使用Observable.create()创建被观察者
Observable observable1 = Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
subscriber.onNext("Hello");
subscriber.onNext("Wrold");
subscriber.onCompleted();
}
});
//订阅
observable1.subscribe(observer);
扩展
Subscriber
除了Observer接口之外,RxJava 还内置了一个实现了Observer的抽象:Subscriber。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是完全一样的。它们的区别对于使用者来说主要有两点:
onStart(): 这是Subscriber增加的方法。它会在 subscribe 刚开始,而事件还未发送之前被调用,可以用于做一些准备工作,例如数据的清零或重置。这是一个可选方法,默认情况下它的实现为空。需要注意的是,如果对准备工作的线程有要求(例如弹出一个显示进度的对话框,这必须在主线程执行),onStart()就不适用了,因为它总是在 subscribe 所发生的线程被调用,而不能指定线程。要在指定的线程来做准备工作,可以使用doOnSubscribe()方法,具体可以在后面的文中看到。
unsubscribe(): 这是Subscriber所实现的另一个接口Subscription
的方法,用于取消订阅。在这个方法被调用后,Subscriber将不再接收事件。一般在这个方法调用前,可以使用isUnsubscribed()先判断一下状态。unsubscribe()这个方法很重要,因为在subscribe()之后,Observable会持有Subscriber的引用,这个引用如果不能及时被释放,将有内存泄露的风险。所以最好保持一个原则:要在不再使用的时候尽快在合适的地方(例如onPause()onStop()等方法中)调用unsubscribe()来解除引用关系,以避免内存泄露的发生。Observable
Observable的其他几种创建方法,一下Observable等价于之前使用Create()创建的Observable:
1、使用Observable.just()创建被观察者
Observable observable2 = Observable.just("Hello", "World");
2、使用Observable.from()创建被观察者
String [] words = {"Hello", "World"};
Observable observable3 = Observable.from(words);
或
List<String> list = new ArrayList<String>();
list.add("Hellow");
list.add("Wrold");
Observable observable4 = Observable.from(list);
Android RxJava的使用(一)基本用法
Android RxJava的使用(三)转换(map、flatMap)
Android RxJava的使用(四)线程控制 —— Scheduler