RxJava2,移动互联网app开发入门

本文详细解析了RxJava中Observable.create()的实现原理,它返回一个ObservableCreate对象,内部保存传入的ObservableOnSubscribe。接着,通过Observer接口创建观察者,并在subscribe()方法中调用ObservableCreate的subscribeActual()。该方法创建CreateEmitter并调用其onSubscribe(),最终将事件传递给被观察者。此外,还介绍了CreateEmitter的内部实现,包括onNext(), onError()和onComplete()方法。文章最后强调了架构师应具备的抽象思维和系统分析能力,并分享了Android架构师的必备知识技能和学习资料。

} catch (Throwable ex) {

Exceptions.throwIfFatal(ex);

parent.onError(ex);

}

}

…省略部分代码

}

根据代码我们清楚的看到这个类复写了父类Observable的***subscribeActual()***方法,做了自己实现,实现内容我们下面在做分析。

到这一步我们可以知道,Observable.create()方法其实就是返回了一个ObservableCreate对象,对象内部通过一个成员变量source保存我们传入的ObservableOnSubscribe对象,也可以理解为我们的被观察者,ObservableCreate只是在我们的被观察者对象外面包装了一层。

2.调用new Observer();创建了一个观察者

Observer是一个接口,内部定义了四个方法。这里通过匿名内部类的方式创建了一个观察者。

public interface Observer {

void onSubscribe(@NonNull Disposable d);

void onNext(@NonNull T t);

void onError(@NonNull Throwable e);

void onComplete();

}

3.subscribe()建立订阅关系

(1)Observable.subscribe()方法

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

//校验输入的观察者不能为null

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”);

//直接调用ObservableCreate的subscribeActual()方法,这个方法传入了一个观察者。

subscribeActual(observer);

} catch (NullPointerException e) { // NOPMD

throw e;

} catch (Throwable e) {

Exceptions.throwIfFatal(e);

// can’t call onError because no way to know if a Disposable has been set or not

// can’t call onSubscribe because the call might have set a Subscription already

RxJavaPlugins.onError(e);

NullPointerException npe = new NullPointerException(“Actually not, but can’t throw other exceptions due to RS”);

npe.initCause(e);

throw npe;

}

}

由上述代码我们可以知道,当我们调用subscribe()方法建立订阅关系的时候,其实就是调用我们第一步创建的ObservableCreate对象内部重写的subscribeActual()方法传入了一个观察者,下面我们来分析subscribeActual()方法的实现。

(2).ObservableCreate.subscribeActual()

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

//通过传入的观察者对象创建一个事件发射器

CreateEmitter parent = new CreateEmitter(observer);

//调用观察者的onSubscribe()方法,传入一个发射器。

observer.onSubscribe(parent);

try {

//source对象,就是传入的被ObservableOnSubscribe对象

//调用它的subscribe()方法传入一个事件发射器

source.subscribe(parent);

} catch (Throwable ex) {

Exceptions.throwIfFatal(ex);

parent.onError(ex);

}

}

(3)new CreateEmitter(observer)

下面我们来看看CreateEmitter的内部实现。

static final class CreateEmitter

extends AtomicReference

implements ObservableEmitter, Disposable {

private static final long serialVersionUID = -3434801548987643227L;

final Observer<? super T> observer;

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

//调用观察者的onNext()方法

observer.onNext(t);

}

}

@Override

public void onError(Throwable t) {

if (!tryOnError(t)) {

RxJavaPlugins.onError(t);

}

}

@Override

public boolean tryOnError(Throwable t) {

if (t == null) {

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

}

if (!isDisposed()) {

try {

observer.onError(t);

} finally {

dispose();

}

return true;

}

return false;

}

@Override

public void onComplete() {

if (!isDisposed()) {

try {

observer.onComplete();

} finally {

dispose();

}

}

}

@Override

public void setDisposable(Disposable d) {

DisposableHelper.set(this, d);

}

@Override

public void setCancellable(Cancellable c) {

setDisposable(new CancellableDisposable©);

}

@Override

public ObservableEmitter serialize() {

return new SerializedEmitter(this);

}

@Override

public void dispose() {

DisposableHelper.dispose(this);

}

@Override

public boolean isDisposed() {

return DisposableHelper.isDisposed(get());

}

如何成为Android高级架构师!

架构师必须具备抽象思维和分析的能力,这是你进行系统分析和系统分解的基本素质。只有具备这样的能力,架构师才能看清系统的整体,掌控全局,这也是架构师大局观的形成基础。 你如何具备这种能力呢?一是来自于经验,二是来自于学习。

架构师不仅要具备在问题领域上的经验,也需要具备在软件工程领域内的经验。也就是说,架构师必须能够准确得理解需求,然后用软件工程的思想,把需求转化和分解成可用计算机语言实现的程度。经验的积累是需要一个时间过程的,这个过程谁也帮不了你,是需要你去经历的。

但是,如果你有意识地去培养,不断吸取前人的经验的话,还是可以缩短这个周期的。这也是我整理架构师进阶此系列的始动力之一。


成为Android架构师必备知识技能

对应导图的学习笔记(由阿里P8大牛手写,我负责整理成PDF笔记)

部分内容展示

《设计思想解读开源框架》

  • 目录
  • 热修复设计
  • 插件化框架设计

    《360°全方面性能优化》
  • 设计思想与代码质量优化
  • 程序性能优化

开源框架》**

  • 目录
    [外链图片转存中…(img-zBWGSUPc-1645005769363)]
  • 热修复设计
    [外链图片转存中…(img-0J4JeXjO-1645005769364)]
  • 插件化框架设计
    [外链图片转存中…(img-hrfITRje-1645005769364)]
    《360°全方面性能优化》
    [外链图片转存中…(img-JBkd1uKL-1645005769364)]
  • 设计思想与代码质量优化
    [外链图片转存中…(img-WsgOvdvN-1645005769365)]
  • 程序性能优化
    [外链图片转存中…(img-LoWjhMB9-1645005769365)]

本文在开源项目:【GitHub 】中已收录,里面包含不同方向的自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值