RxJava框架是一种基于扩展式的观察者模式
Rxjava的扩展观察者模式中有4个角色:
被观察者,观察者,订阅,事件;
原理可以定义为:被观察者(Observable)通过订阅(Subscribe)按照顺序发送事件给观察者(Observer),观察者按照事件发送的顺序,来接收事件并且对事件做出响应;
Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(@NonNull ObservableEmitter<Integer> emitter) throws Throwable {
emitter.onNext(1);
emitter.onNext(2);
emitter.onNext(3);
emitter.onComplete();
}
}).subscribe(new Observer<Integer>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
Log.d(TAG, "onSubscribe:" + d.getClass().getName());
}
@Override
public void onNext(@NonNull Integer integer) {
Log.d(TAG, "onNext: " + integer);
}
@Override
public void onError(@NonNull Throwable e) {
Log.d(TAG, "onError: " + e.getMessage());
}
@Override
public void onComplete() {
Log.d(TAG, "onComplete");
}
});
该框架执行流程一共分为4步:
1.调用Observable.subscribe(observer),用于观察者订阅被观察者;
2.创建发射器,给被观察者添加订阅的内容;
3.然后通过观察者的obSubscribe方法,将发射器Emitter对象传递给观察者;
4.发射器发射数据,观察者接收数据
步骤一:观察者订阅被观察者
调用subscribe方法,源码分析:
public final void subscribe(Observer<? super T> observer) {
......
subscribeActual(observer);
}
会执行一个subscribeActual方法,该方法的实现是在ObservableCreate类(因为Observable.create方法返回的对象是ObservableCreate对象)中:
protected void subscribeActual(Observer<? super T> observer) {
CreateEmitter<T> parent = new CreateEmitter<T>(observer);
observer.onSubscribe(parent);
//source是ObservableOnSubscribe对象,正是执行create方法时,传入的对象
source.subscribe(parent);
}
observer.onSubscribe方法是将发射器传递给观察者
source.subscribe方法是将发射器数据发送出去
步骤二:发送数据:
在步骤一中,通过调用ObservableOnSubscribe类中的onSubscribe方法,将Emitter对象,传递给了ObservableOnSubscribe对象,所以在执行onSubscribe方法时,可以利用该emitter对象执行数据发送:
emitter.onNext(1);
emitter.onComplete();
在subscribeActual方法中,注意到:
CreateEmitter<T> parent = new CreateEmitter<T>(observer);
创建Emitter对象时,会将observer传递过去,同时传递给ObservableOnSubscribe类的emitter与该emitter对象是同一个对象;
因此在执行emitter的方法时,源码分析:
public void onNext(T t) {
if (!isDisposed()) {
observer.onNext(t);
}
}
会执行observer类中的对应的方法,因此就解释了被观察者在发送数据的时候,观察者同时能够接收到数据,并执行;
查考文献:
RxJava框架-详解