Android进阶知识:RxJava相关,图文详解

本文详细剖析了RxJava的订阅过程,从`subscribe`方法开始,逐步解析`subscribeActual`和`ObservableOnSubscribe`的交互。同时,文章探讨了RxJava如何实现线程切换,通过`subscribeOn`和`observeOn`方法,揭示了线程调度的底层逻辑,包括`Scheduler`、`Worker`和`Handler`在其中的作用。
摘要由CSDN通过智能技术生成

建立订阅关系调用了Observablesubscribe方法。

public final void subscribe(Observer<? super T> observer) {

ObjectHelper.requireNonNull(observer, “observer is null”);

try {

observer = RxJavaPlugins.onSubscribe(this, observer);

ObjectHelper.requireNonNull(observer, “The RxJavaPlugins.onSubscribe hook returned a null Observer. Please change the handler provided to RxJavaPlugins.setOnObservableSubscribe for invalid null returns. Further reading: https://github.com/ReactiveX/RxJava/wiki/Plugins”);

subscribeActual(observer);

} catch (NullPointerException e) { // NOPMD

} catch (Throwable e) {

}

}

方法中还是先判断了传入参数observer是否为空,接着还是一个Hook实现,这里就不细究了,获得Hook返回的observer后再次判断是否为空,之后调用了subscribeActual方法。

protected abstract void subscribeActual(Observer<? super T> observer);

ObservablesubscribeActual方法是个抽象方法,之前看过这里的Observable实际实现是个ObservableCreate对象,所以再进入ObservableCreate类查看对应方法。

@Override

protected void subscribeActual(Observer<? super T> observer) {

CreateEmitter parent = new CreateEmitter(observer);

observer.onSubscribe(parent);

try {

source.subscribe(parent);

} catch (Throwable ex) {

Exceptions.throwIfFatal(ex);

parent.onError(ex);

}

}

ObservableCreate中的subscribeActual方法中先创建了一个CreateEmitter发射器对象,并将observer对象传入。接着调用了observeronSubscribe方法,此时观察者的onSubscribe方法执行。最后调用了sourcesubscribe方法。

Observable observable = Observable.create(new ObservableOnSubscribe() {

@Override

public void subscribe(ObservableEmitter emitter) throws Exception {

Log.d(getClass().getName(), Thread.currentThread().getName() + " ObservableOnSubscribe subscribe");

emitter.onNext(“string1”);

emitter.onNext(“string2”);

emitter.onNext(“string3”);

emitter.onComplete();

}

});

这个source就是在create方法中传入的ObservableOnSubscribe。它的subscribe方法中通过调用ObservableEmitter的方法发送事件,这里的ObservableEmitter就是之前创建的CreateEmitter对象,所以再来进一步看看它其中的方法。

CreateEmitter(Observer<? super T> observer) {

this.observer = observer;

}

@Override

public void onNext(T t) {

if (t == null) {

onError(new NullPointerException(“onNext called with null. Null values are generally not allowed in 2.x operators and sources.”));

return;

}

if (!isDisposed()) {

observer.onNext(t);

}

}

@Override

public void onComplete() {

if (!isDisposed()) {

try {

observer.onComplete();

} finally {

dispose();

}

}

}

CreateEmitter的构造函数接收了观察者对象,然后在调用onNext方法时先做了空判断,再对isDisposed进行取消订阅的判断,之后调用了observeronNext方法,也就是观察者的onNext方法。同样的onComplete中最终也是调用了observeronComplete方法。至此RxJava中的基本订阅流程的源码就梳理完了。

4. 线程切换


RxJava中有个很重要的功能,就是能方便的切换线程,来看下它的使用,还是之前基础使用中的例子进行修改。

Observable observable0 = Observable.create(new ObservableOnSubscribe() {

@Override

public void subscribe(ObservableEmitter emitter) throws Exception {

Log.d(getClass().getName(), Thread.currentThread().getName() + " ObservableOnSubscribe subscribe");

emitter.onNext(“string1”);

emitter.onNext(“string2”);

emitter.onNext(“string3”);

emitter.onComplete();

}

});

Observer observer = new Observer() {

@Override

public void onSubscribe(Disposable d) {

Log.d(getClass().getName(), Thread.currentThread().getName() + " onSubscribe");

}

@Override

public void onNext(String s) {

Log.d(getClass().getName(), Thread.currentThread().getName() + " onNext "+s);

}

@Override

public void onError(Throwable e) {

Log.d(getClass().getName(), Thread.currentThread().getName() + " onError");

}

@Override

public void onComplete() {

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值