前言

​关于RxJava的基础心法解析​

我们在使用 ​​RxJava​​​ 的时候必不可少的会使用一些基础的操作符, ​​map​​​ 、 ​​flatMap​​​ 、 ​​filter​​​ 等。这些都是对 ​​Obserbable​​​ 进行各种各样的变化,我们查看其实现都能看到一个叫做 ​​lift​​ 的操作符。

lift源码

我们先看源码(rxjava:1.3.0),再通过一个例子来熟悉、掌握。

public interface Func1<T, R> extends Function {
R call(T t);
}
//注意操作符的入参和出参都是Subscriber
public interface Operator<R, T> extends Func1<Subscriber<? super R>, Subscriber<? super T>> {
// cover for generics insanity
}

public final <R> Observable<R> lift(final Operator<? extends R, ? super T> operator) {
//创建新的Observable,OnSubscribeLift代替原理的onSubscribe
return unsafeCreate(new OnSubscribeLift<T, R>(onSubscribe, operator));
}

public final class OnSubscribeLift<T, R> implements OnSubscribe<R> {
//上一层的Observable的onSubscribe
final OnSubscribe<T> parent;
//需要变换的操作符
final Operator<? extends R, ? super T> operator;
public OnSubscribeLift(OnSubscribe<T> parent, Operator<? extends R, ? super T> operator) {
this.parent = parent;
this.operator = operator;
}
@Override
public void call(Subscriber<? super R> o) {
try {
//调用操作符的call方法,operator.call
Subscriber<? super T> st = RxJavaHooks.onObservableLift(operator).call(o);
try {
st.onStart();
parent.call(st);
} catch (Throwable e) {
Exceptions.throwIfFatal(e);
st.onError(e);
}
} catch (Throwable e) {
Exceptions.throwIfFatal(e);
o.onError(e);
}
}
}

源码解读

以上为 ​​lift​​​ 操作相关的代码,我们先不管泛型中的 ​​R​​​ 、 ​​T​​ 之类的,这种情况下根据泛型去推到容易让其更加的复杂。所以我们先简化一下代码:

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

小明要吃冰淇淋之RxJava:lift原理_rxjava

图片来自:​​扔物线 - 给 Android 开发者的 RxJava 详解​

简单的来看,以上过程产生了两个 ​​Observable​​​ 和 ​​OnSubscribe​​ :

  • 创建了一个新的​​Observable​​ ;
  • 新的​​Observable​​​ 的成员变量​​onSubscribe​​​ 变化成了​​OnSubscribeLift​​ ;
  • 进过操作符​​operator​​​ 变换之后的​​newSubscribe​​​ ,变成的原来的​​Obserbable​​ 的订阅者;
  • 操作符​​operator​​​ 之后的订阅者,订阅的是新的​​Observable​​ ;

整个实现 ​​lift()​​ 的过程,有点像一种代理机制,通过事件拦截和处理实现事件序列的变换。我们举个生活中的例子加深一下印象:

小明需要买一个冰淇淋,他不用去冰淇淋制造厂;
冰淇淋制造厂将制造出的冰淇淋,交给商店进行售卖;
商店进购了冰淇淋之后,买给了小明;

这里 ​​商店​​​ 相当于一个 ​​lift()​​​ 操作符。
​​​小明​​​ 订阅 ​​冰淇淋​​​ 的过程: ​​商店​​​ 订阅了 ​​工厂​​​ 的 ​​冰淇淋​​​ , ​​小明​​​ 订阅了 ​​商店​​​ 的 ​​冰淇淋​​ 。

这么通俗的讲解相比大家都对 ​​lift​​ 已经印象非常深刻了吧!

文章到这里就全部讲述完啦,若有其他需要交流的可以留言哦


小明要吃冰淇淋之RxJava:lift原理_操作符_02