RxJava框架原理分析

RxJava框架是一种基于扩展式的观察者模式
Rxjava的扩展观察者模式中有4个角色:
被观察者,观察者,订阅,事件;
原理可以定义为:被观察者(Observable)通过订阅(Subscribe)按照顺序发送事件给观察者(Observer),观察者按照事件发送的顺序,来接收事件并且对事件做出响应;

RxJava框架的流程图

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框架-详解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值