前言
因为这些时间我一直在写RxJava操作符源码解析,每次讲到一些操作符的时候,就不免要涉及到了lift
变换。所以这里我单独拿出来讲解一下,希望能对大家有帮助。
正文
一般学了 RxJava
的人都会看这篇文章,图文并茂,写的很好。
其中就介绍到了lift
。归纳的也比较好。其中一段代码是这样的。
// 注意:这不是 lift() 的源码,而是将源码中与性能、兼容性、扩展性有关的代码剔除后的核心代码。
// 如果需要看源码,可以去 RxJava 的 GitHub 仓库下载。
public <R> Observable<R> lift(Operator<? extends R, ? super T> operator) {
return Observable.create(new OnSubscribe<R>() {
@Override
public void call(Subscriber subscriber) {
Subscriber newSubscriber = operator.call(subscriber);
newSubscriber.onStart();
onSubscribe.call(newSubscriber);
}
});
}
虽然不是lift
源码,但是作用是一样的,比源码更容易懂。
这里涉及到到create
,大家可以看下我的这篇文章我是最简单的操作符-----Create。
下面我们来分析上面的这段代码。主要做了什么事情呢。
我们一句一句来分析
- Observable.create
lift方法调用后最终返回的其实还是一个Observable
对象。 - observable.subscribe 这一句代码没有,但是连起来看,会更顺畅
Observable
对象最终肯定会调用subscribe
方法。在这篇文章我是最简单的操作符-----Create中已经有介绍,observable.subscribe
最后,其实就是observable.onSubscribe.call(subscriber)
重点来了----->
这里的subscriber
调用observable.subscribe
传入的参数。也就是我们自己的onNext
,onError
,onComplete
这几个抽象方法的一个实现的对象。
这里的observable.onSubscribe
是 代码
new OnSubscribe<R>() {
@Override
public void call(Subscriber subscriber) {
Subscriber newSubscriber = operator.call(subscriber);
newSubscriber.onStart();
onSubscribe.call(newSubscriber);
}
}
创建的OnSubscribe
对象。
所以observable.onSubscribe.call(subscriber)
其实就是直接调用了上面的这段代码的call
方法。
call方法一共3行,我们一看就知道哪句是最重要的。
Subscriber newSubscriber = operator.call(subscriber);
这一句是关键,为什么要叫lift
,其实就是要把一个Subscriber
变换为另外一个Subscriber
。lift
方法需要传入一个Operator
对象,而Operator
对象就是如何把Subscriber
变换为另外一个Subscriber
的具体实现。
那么我们来选取一个简单的Operator
接口实现来看一下。大家可以看一下这篇文章我是用来组合的操作符------Buffer,里面就有一个具体的Operator
实现。没看过的朋友可以简单看一下,了解一下。
public final class OperatorBufferWithSize<T> implements Operator<List<T>, T>
OperatorBufferWithSize
的作用就是把List<T>
类型的Subscriber
转化为了T
类型的Subscriber
。至于为什么OperatorBufferWithSize
的作用不是把T
类型的Subscriber
转化为List<T>
类型的Subscriber
,在我是用来组合的操作符------Buffer这篇文章中也有所介绍。
由于我们的正常的思维一直是从上至下,所以这里可能理解起来会有点难度。
给 Android 开发者的 RxJava 详解
这篇文章中有一张图片
当我们使用链式结构,使用了很多操作符的时候,其实会创建很多的Observable
对象。但是我们使用的其实是最后一个创建的Observable
。
很明显,我们是从最后一个Observable
开始运行,然后一步步往上调用,其实这里调用的是当前对应的observable.onSubscribe.call(subscriber)
,当然这里的3个对象observable
,onSubscribe
,subscriber
都是不停在变化的,有点递归的意思。我们只需要先知道,从下往上,调用的是onSubscribe
对象的call
方法。到达最顶部的一个Observable
的onSubscribe
的call
方法执行后,就一步步往下调用subscriber
的onNext
方法。
而lift
的作用就是在一步步往上调用call
方法的使用改变Subscriber
对象。
这样我们就能够理解OperatorBufferWithSize
的作用就是把List<T>
类型的Subscriber
转化为了T
类型的Subscriber
。
总结:lift的作用:在链式结构中,从下往上看,把下面的类型的
Subscriber
转化为了上面类型的Subscriber
。(结合上下文来理解这句话)