博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Rxjava2 源码解析 (四)
阅读量:6093 次
发布时间:2019-06-20

本文共 3238 字,大约阅读时间需要 10 分钟。

hot3.png

前言

    不知不觉都已经写到第四篇了,虽然写的不是很好,但是最重要的用途还是自己记录下,能够提高自己最重要。

    从本篇开始,代码的分析将会趋于简单化,因为有了上面三篇的基础,基本已经了解了Observable中的设计方式,无非就是Observable一层层封装,Observer也是一层层封装通过链式实现链式。

Observable.Create

    今天突然发现最基本的Create方法忘记了,赶紧拿起来看下。

public static 
Observable
create(ObservableOnSubscribe
source) { ObjectHelper.requireNonNull(source, "source is null"); return RxJavaPlugins.onAssembly(new ObservableCreate
(source)); }

    该方法传入的参数是一个ObservableOnSubscribe类型的参数。和rxjava1中的参数不同了,但是效果还是一样的,就是相当于让你自己发送数据。

    返回了一个ObservableCreate,直接看一下

@Override    protected void subscribeActual(Observer
observer) { CreateEmitter
parent = new CreateEmitter
(observer); observer.onSubscribe(parent); try { source.subscribe(parent); } catch (Throwable ex) { Exceptions.throwIfFatal(ex); parent.onError(ex); } }

    代码很直观,套路也一样,讲observer观察者封装一层,CreateEmitter,然后直接调用observer的onSubscribe方法,传入一个Disposable,和其他一样,这里的CreateEmitter不仅承载了观察者的作用,还承载了Disposable的作用。

    然后调用source(也就是我们Create时传入的参数)的subscribe方法,意思差不多是“请开始你的表演!”

    该方法的参数是ObservableEmitter类型,拥有onNext系列,以及对于Disposable控制的抽象方法等待实现,当然这里就是CreateEmitter了,来看下。

    我们回去调用 CreateEmitter的onNext发送数据,而他实际上就是调用被封装了的observer观察者的onNext方法……完全合理,没啥技术含量嘛……

Lift

    曾经不知道在哪篇博客上看到,所有的操作符实际上都是基于lift

public final 
Observable
lift(ObservableOperator
lifter) { ObjectHelper.requireNonNull(lifter, "onLift is null"); return RxJavaPlugins.onAssembly(new ObservableLift
(this, lifter)); }

    基础代码还是一样简答,创建了一个ObservableLift对象,并且直接返回。

@Override    public void subscribeActual(Observer
s) { Observer
observer; try { observer = ObjectHelper.requireNonNull(operator.apply(s), "Operator " + operator + " returned a null Observer"); } .... source.subscribe(observer); }

    这段代码也比较容易,其中operator就是我们调用lift时传入的参数。通过apply方法,将subscribe注册的观察者进行封装,然后注册到源被观察者上。

    以前一直以为lift是操作被观察者,将它发送的数据转换成我们需要的类型。但是实际情况可能是相反的,逻辑大概如下:

    首先我有一个返回String类型的observable ,但是我需要注册一个接收Int类型的观察者。于是我们调用lift方法,将int类型的观察者转换成string类型的观察者,注册到这个observable中。

    那么数据应该如何适配呢?这个就取决于用户在apply中的实现方案了,比如可以这样:

public Observer
apply(@NonNull final Observer
observer) throws Exception { return new Observer
() { @Override public void onSubscribe(Disposable d) { observer.onSubscribe(d); } @Override public void onNext(String s) { observer.onNext(Integer.parseInt(s)); } @Override public void onError(Throwable e) { observer.onError(e); } @Override public void onComplete() { observer.onComplete(); } }; }

    我们输入一个observer<integer>,封装一下,输出了一个observer<string> 。

    以上就是lift所做的所有事情,框架帮我们的做得很少,所以我们觉得使用lift的难度比较大,但是掌握它的根本原理和实际意义,那么实际上,它是最肤浅的操作符了!

Map

    map操作的实现,简单来说就是封装,然后在onNext或者poll中对数据进行类型转化后返回。

转载于:https://my.oschina.net/zzxzzg/blog/882409

你可能感兴趣的文章
根据Uri获取文件的绝对路径
查看>>
Flutter 插件开发:以微信SDK为例
查看>>
.NET[C#]中NullReferenceException(未将对象引用到实例)是什么问题?如何修复处理?...
查看>>
边缘控制平面Ambassador全解读
查看>>
Windows Phone 7 利用计时器DispatcherTimer创建时钟
查看>>
程序员最喜爱的12个Android应用开发框架二(转)
查看>>
vim学习与理解
查看>>
DIRECTSHOW在VS2005中PVOID64问题和配置问题
查看>>
MapReduce的模式,算法以及用例
查看>>
《Advanced Linux Programming》读书笔记(1)
查看>>
zabbix agent item
查看>>
一步一步学习SignalR进行实时通信_7_非代理
查看>>
为什么我弃用GNOME转向KDE(2)
查看>>
Redis学习记录初篇
查看>>
爬虫案例若干-爬取CSDN博文,糗事百科段子以及淘宝的图片
查看>>
Web实时通信技术
查看>>
第三章 计算机及服务器硬件组成结合企业运维场景 总结
查看>>
IntelliJ IDEA解决Tomcal启动报错
查看>>
默认虚拟主机设置
查看>>
php中的短标签 太坑人了
查看>>