个人博客地址 http://dandanlove.com/

前言

关于RxJava的基础心法解析

我们在使用 RxJava 的时候必不可少的会使用一些基础的操作符, mapflatMapfilter 等。这些都是对 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 操作相关的代码,我们先不管泛型中的 RT 之类的,这种情况下根据泛型去推到容易让其更加的复杂。所以我们先简化一下代码:

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 详解

简单的来看,以上过程产生了两个 ObservableOnSubscribe :

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

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

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

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

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

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

想阅读作者的更多文章,可以查看我 个人博客 和公共号:

小明要吃冰淇淋之RxJava:lift原理相关推荐

  1. Python面向对象:小明和小美爱跑步

    需求:小明和小美爱跑步,小明体重75.0公斤,小美体重45.0公斤,每次跑步会减肥0.5公斤,每吃一顿饭会增加1公斤 分析:类名:person, 属性:name,weight, 方法:run,eat ...

  2. Python中面向对象封装案例——小明爱跑步、摆放家具

    文章目录 面向对象封装案例 目标 1. 封装 2. 小明爱跑步 2.1 小明爱跑步扩展 -- 小美也爱跑步 3. 摆放家具 3.1 创建家具 3.2 创建房间 3.3 添加家具 3.4 小结 面向对象 ...

  3. python入门笔记——面向对象基础1_5(小明爱跑步案例)

    案例: 小明爱跑步:实际项目需求如下 ①小明体重 75.0 公斤 ②小明每次跑步 会减少0.5公斤 ③小明每次吃东西 会增加 1公斤 1.案例分析: 名字提炼法,小明--人类: 属性--体重 动词提炼 ...

  4. 7-86 小明的晚饭 (50分)

    小明最近很用功学习,所以经常忘记吃饭.小明决定给自己放个假去大吃一顿,到了吃饭的地方后,小明陷入了沉思,因为他很纠结不知道吃什么,所以他全都要.小明的食量是无限的并且是个贪心的人,所以他想吃完自己支付 ...

  5. 18. 爱吃皮蛋的小明(斐波那契数列)

    时间限制: 1 s 空间限制: 32000 KB 题目等级 : 白银 Silver 题解 题目描述 Description 小明特别爱吃蛋,特别是皮蛋.他一次可以吃一个蛋或者两个蛋(整个吞下去),而且 ...

  6. 蓝桥杯真题 包子凑数 c++代码实现 小明几乎每天早晨都会在一家包子铺吃早餐。他发现这家包子铺有 N 种蒸笼,其中第 i种蒸笼恰好能放 Ai个包子。

    文章目录 题目描述 输入描述 输出描述 输入输出样例 示例 1 示例 2 运行限制 代码 思路 题目描述 小明几乎每天早晨都会在一家包子铺吃早餐.他发现这家包子铺有 N 种蒸笼,其中第 i 种蒸笼恰好 ...

  7. nyoj 55 懒省事的小明

    懒省事的小明 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 小明很想吃果子,正好果园果子熟了.在果园里,小明已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆 ...

  8. 编写python程序、计算账户余额_小明有20w存款存在余额宝中,按余额宝年收益为3.35%计算,用Python编写程序计算,多少年后小明的存款达到30w?...

    [判断题]卤素灯泡是在灯泡内充入氟.氯等卤素气体. [单选题]我国刑法第12条关于溯及力的规定采取的是( ). [填空题]本地局域网 LAN 内, () 和无绳电话速率较低,主流带宽是 100kbps ...

  9. 小明爱跑步-扩展-多个对象属性之间互不干扰

    class Person:def __init__(self, name, weight):# self.属性 = 形参self.name = nameself.weight = weightdef ...

最新文章

  1. Windows10如何设置系统保护色
  2. ROS知识:关于如何命名的约定
  3. Python基础06-Python异常处理
  4. putty 中文乱码
  5. Node爬取简书首页文章
  6. TCP/IP:IP多播选路
  7. Okhttp 源码解析
  8. 如何克服枯燥工作带来的单调感和厌烦感
  9. 十一、网络编程。TCP\UDP\socket
  10. Office系列软件之间不兼容以及office修复
  11. qomo linux最新版本,Qomo Linux下一个版本将推驱动中心
  12. 心态-《自我成长的力量》书中的精髓:自我成长的过程需要我们不断觉察自己、改变自己、活出自己,从而成长为最好的自己。
  13. 【航拍中国第二季】甘肃笔记
  14. java mocked_java – 使mocked方法返回传递给它的参数
  15. 谷歌研究——四足机器人模仿动物动作
  16. 【数据结构】赫夫曼树
  17. [词性] 十八、介词 8 [ within ] [ within ] [ across ] [ among ] [ outside ] [ into ] [ beyond ] [ against ]
  18. wifidog原理分析
  19. python 导入模型_scikit-learn系列之如何存储和导入机器学习模型
  20. 软件单元测试操作步骤(java版)

热门文章

  1. 行业分析| 智慧头盔在快对讲上的应用与实践
  2. IPv4路由下一跳合法性检测
  3. python 显示PGM格式图片的3种方式
  4. java jcf框架干啥的_Java 之 集合框架(JCF)
  5. js:面向对象编程,带你认识封装、继承和多态
  6. 江苏科技大学《CS》:碳纤维复合材料钻孔过程动态渐进破坏的跨尺度模拟
  7. 突发!开源项目LayUI宣布下线 !
  8. 逆向学习X64DBG
  9. (程序员情感三部曲之一)找个程序员做老公,挺好!
  10. pycharm快捷键完整版