前言
越来越多的开源项目使用了rxjava2,最近才开始认真的沉下来学习rxjava2,想写个笔记记录和整理下自己所学,顺便可以加深下印象。
学习rxjava2,首先要大概了解下它能做什么,为什么选择使用它?
翻看git上rxjava说明,a library for composing asynchronous and event-based programs by using observable sequences.(一个库,用于通过使用可观察序列来编写异步和基于事件的程序)。这句话重点就是rxjava是编写异步的库。那我们使用异步已经有AsyncTask和Handler,那为什么还要使用rxjava呢?那是因为rxjava来实现异步更简洁、更容易、代码逻辑更清晰,而且还有很多和android相关的库,可以很方便的在其他线程和主线程中来回切换。
首先我们来简单说下rxjava的一些基本内容。rxjava是通过扩展的观察者模式来实现的。
作为观察者模式,它有几个部分Observables(被观察者)、Observable(观察者)、subscribe(订阅)和event(事件)。Observable(被观察者) subscribe(订阅) Observer (观察者)实现订阅关系,Observable Emitter(发射)事件由已经订阅的Observer接收并处理。
看下简单的图解
空说可能不好理解,我们来写一下代码实现下。
android开发者使用rxjava2,应该在gradle中引用两个库文件,如下
// RxJava2 Dependencies
implementation 'io.reactivex.rxjava2:rxjava:2.2.2'
implementation 'io.reactivex.rxjava2:rxandroid:2.1.0'
1.创建一个Observable(被观察者)
private Observable<String> getObservable() {
return Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(ObservableEmitter<String> emitter) throws Exception {
emitter.onNext("1");
emitter.onNext("2");
emitter.onNext("3");
emitter.onComplete();
}
});
}
2.创建一个Observer(观察者)
private Observer<String> getObserver() {
return new Observer<String>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(String value) {
Log.d(TAG, " onNext : value : " + value);
}
@Override
public void onError(Throwable e) {
Log.d(TAG, " onError : " + e.getMessage());
}
@Override
public void onComplete() {
Log.d(TAG, " onComplete");
}
};
}
3.Observable(被观察者) subscribe(订阅) Observer (观察者)实现订阅关系
getObservable()
// Run on a background thread
.subscribeOn(Schedulers.io())
// Be notified on the main thread
.observeOn(AndroidSchedulers.mainThread())
.subscribe(getObserver());
在上面的例子中,上游Observable Emitter(发射)了四个事件
emitter.onNext("1");
emitter.onNext("2");
emitter.onNext("3");
emitter.onComplete();
下游观察者依次打印结果如下
onNext : value : 1
onNext : value : 2
onNext : value : 3
onComplete
示例图
我们可以注意到Observer中有四个方法onSubscribe、onNext、onError和onComplete,其实这几个方法被调用的时机可以通过他们的名称就有所了解。onSubscribe被订阅的时候触发,onNext、onError和onComplete都是Observable Emitter主动发射后接收触发。
对于Observer (观察者)的几个方法,有以下几点注意即可:
onNext():可以接收多次 onNext() 事件,当onCompleted或者onError后,emitter再次发射新的 onNext() 事件不再被接收到。
onCompleted(): 事件队列完结。RxJava 不仅把每个事件单独处理,还会把它们看做一个队列。RxJava 规定,当不会再有新的 onNext() 发出时,需要触发 onCompleted() 方法作为标志。
onError(): 事件队列异常。在事件处理过程中出异常时,onError() 会被触发,同时队列自动终止,不允许再有事件发出。
在一个正确运行的事件序列中, onCompleted() 和 onError() 有且只有一个,并且是事件序列中的最后一个。需要注意的是,onCompleted() 和 onError() 二者也是互斥的,即在队列中调用了其中一个,就不应该再调用另一个。
参考资料,参考但不局限以下链接
https://gank.io/post/560e15be2dca930e00da1083
https://blog.csdn.net/qq_29366131/article/details/75529902