admin 管理员组文章数量: 1086866
小明要吃冰淇淋之RxJava:lift原理
个人博客地址 /
前言
关于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代替原理的onSubscribereturn unsafeCreate(new OnSubscribeLift<T, R>(onSubscribe, operator));
}public final class OnSubscribeLift<T, R> implements OnSubscribe<R> {//上一层的Observable的onSubscribefinal 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;}@Overridepublic void call(Subscriber<? super R> o) {try {//调用操作符的call方法,operator.callSubscriber<? 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>() {@Overridepublic void call(Subscriber subscriber) {Subscriber newSubscriber = operator.call(subscriber);newSubscriber.onStart();onSubscribe.call(newSubscriber);}});
}
图片来自:扔物线 - 给 Android 开发者的 RxJava 详解
简单的来看,以上过程产生了两个 Observable
和 OnSubscribe
:
- 创建了一个新的
Observable
; - 新的
Observable
的成员变量onSubscribe
变化成了OnSubscribeLift
; - 进过操作符
operator
变换之后的newSubscribe
,变成的原来的Obserbable
的订阅者; - 操作符
operator
之后的订阅者,订阅的是新的Observable
;
整个实现 lift()
的过程,有点像一种代理机制,通过事件拦截和处理实现事件序列的变换。我们举个生活中的例子加深一下印象:
小明需要买一个冰淇淋,他不用去冰淇淋制造厂;
冰淇淋制造厂将制造出的冰淇淋,交给商店进行售卖;
商店进购了冰淇淋之后,买给了小明;
这里 商店
相当于一个 lift()
操作符。
小明
订阅 冰淇淋
的过程: 商店
订阅了 工厂
的 冰淇淋
, 小明
订阅了 商店
的 冰淇淋
。
这么通俗的讲解相比大家都对 lift
已经印象非常深刻了吧!
文章到这里就全部讲述完啦,若有其他需要交流的可以留言哦!!
想阅读作者的更多文章,可以查看我 个人博客 和公共号:
本文标签: 小明要吃冰淇淋之RxJavalift原理
版权声明:本文标题:小明要吃冰淇淋之RxJava:lift原理 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/b/1693760206a241221.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论