Android进阶知识:RxJava相关,怒斩腾讯和阿里的Offer

本文详细分析了RxJava在Android开发中的应用,特别是如何进行线程切换。首先,文章介绍了CreateEmitter的构造及onNext、onComplete方法的工作原理。接着,通过实例展示了subscribeOn和observeOn的用法,分析了它们在不同线程中运行的情况,并深入源码解释了如何实现线程切换。最后,文章探讨了map操作符的使用及其在简化复杂操作中的作用。
摘要由CSDN通过智能技术生成

这个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() {

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

}

};

Observable observable1 = observable0.subscribeOn(Schedulers.newThread());

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

Observable observable2 = observable1.observeOn(AndroidSchedulers.mainThread());

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

observable2.subscribe(observer);

被观察者和观察者的创建和之前一样,在建立订阅关系时调用subscribeOnobserveOn方法进行线程的切换。这里每个方法返回的都是Observable类型,所以可以采用链式调用,这也是RxJava的一个特点,但是这里没有采用这种写法,而是将其拆分开来写并且日志打印出每个Observable的具体类型,这是为了方便之后源码理解。 运行结果日志:

4.1 subscribeOn

Observable observable1 = observable0.subscribeOn(Schedulers.newThread());

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

observable1.subscribe(observer);

运行结果:

先只调用subscribeOn方法运行查看结果,发现不仅被观察者发射事件运行在了子线程,观察者接收事件也运行在子线程,那么进入subscribeOn方法查看它的实现。

public final Observable subscribeOn(Scheduler scheduler) {

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

return RxJavaPlugins.onAssembly(new ObservableSubscribeOn(this, scheduler));

}

可以看到subscribeOn方法和subscribe方法有些类似。首先是判断传入的scheduler是否为空,然后同样调用RxJavaPlugins.onAssembly方法,这次构建了一个ObservableSubscribeOn对象返回。而subscribeOn方法之后还是调用了subscribe方法,根据之前的分析,subscribe方法最终会调用到subscribeActual方法,不过此时的subscribeActual方法不再是ObservableCreate中的而是ObservableSubscribeOn中的subscribeActual方法。

@Override

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

final SubscribeOnObserver parent = new SubscribeOnObserver(observer);

observer.onSubscribe(parent);

parent.setDisposable(scheduler.s

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值