1、最近学习了下Rxjava2中Single的just操作符以及其订阅过程,这里做个学习笔记方便以后查看,Single可以看着是一个简化版的Observable,它的订阅回调可以只有onSubscribe、onSuccess、onError这三个方法,所以Single常被用于网络请求中。下面看下Single的基本使用:

//注释1
Single<Integer> integerSingle = Single.just(1);//注释2
integerSingle.subscribe(new SingleObserver<Integer>() {@Overridepublic void onSubscribe(Disposable d) {}@Overridepublic void onSuccess(Integer s) {Log.e("znh", "s:" + s);}@Overridepublic void onError(Throwable e) {}
});

2、Single的just操作符源码:

@CheckReturnValue
@SchedulerSupport(SchedulerSupport.NONE)
public static <T> Single<T> just(final T item) {ObjectHelper.requireNonNull(item, "value is null");//注释3return RxJavaPlugins.onAssembly(new SingleJust<T>(item));
}@NonNull
public static <T> Single<T> onAssembly(@NonNull Single<T> source) {Function<? super Single, ? extends Single> f = onSingleAssembly;if (f != null) {return apply(f, source);}//注释4return source;
}

just方法的参数item是泛型T,就是要发送的数据(本例中的数字1),在注释3处在onAssembly方法的参数中,创建了一个SingleJust对象,onAssembly方法的参数类型的Single,而SingleJust是Single的子类,在注释4处返回的source对象,就是注释3处创建的SingleJust对象,下面看下SingleJust类的源码:

public final class SingleJust<T> extends Single<T> {final T value;public SingleJust(T value) {this.value = value;}@Overrideprotected void subscribeActual(SingleObserver<? super T> s) {//注释5s.onSubscribe(Disposables.disposed());s.onSuccess(value);}}

从SingleJust的源码可知,SingleJust确实是继承了Single,要发送的数据item通过SingleJust的构造方法传入并赋值给变量value。

3、注释2处的subscribe订阅方法源码如下:

@SchedulerSupport(SchedulerSupport.NONE)
@Override
public final void subscribe(SingleObserver<? super T> subscriber) {ObjectHelper.requireNonNull(subscriber, "subscriber is null");subscriber = RxJavaPlugins.onSubscribe(this, subscriber);ObjectHelper.requireNonNull(subscriber, "subscriber returned by the RxJavaPlugins hook is null");try {//注释6subscribeActual(subscriber);} catch (NullPointerException ex) {throw ex;} catch (Throwable ex) {Exceptions.throwIfFatal(ex);NullPointerException npe = new NullPointerException("subscribeActual failed");npe.initCause(ex);throw npe;}
}

在注释6处调用了subscribeActual方法,这个方法里的参数subscriber是订阅的时候创建的一个观察者对象,integerSingle的真身是SingleJust,所以这里调用的SingleJust的subscribeActual方法,SingleJust的subscribeActual方法的源码可以查看上文中SingleJust的源码部分,在注释5处调用了观察者的onSubscribe和onSuccess方法,而onSuccess方法中的值就是上游要发送的数据(本例是数字1),这样观察者在下游就可以拿到数据了。

Rxjava2中Single的just操作符源码学习相关推荐

  1. netty中的future和promise源码分析(二)

    前面一篇netty中的future和promise源码分析(一)中对future进行了重点分析,接下来讲一讲promise. promise是可写的future,从future的分析中可以发现在其中没 ...

  2. Learning to Rank中Pointwise关于PRank算法源码实现

    [学习排序] Learning to Rank中Pointwise关于PRank算法源码实现 标签: 学习排序PRankPointwiseLearning to Rank代码实现 2015-01-28 ...

  3. Python中如何查看模块的源码内容

    ubuntu中查看python模块的源码 1. 打开ipython3,进入交互式解释器 2. 导入模块,以io模块为例,查看io.__file__属性,找到源码文件的路径 3. 使用cat命令查看源码 ...

  4. java存入光盘_java 这是 学习笔记(jdk7)书中的光盘里的源码,不知大家需要不,里面都是新手 的好 Develop 238万源代码下载- www.pudn.com...

    文件名称: java下载 收藏√  [ 5  4  3  2  1 ] 开发工具: Java 文件大小: 1272 KB 上传时间: 2013-04-01 下载次数: 18 提 供 者: 孙鹏启 详细 ...

  5. WebRTC[1]-WebRTC中h264解码过程的源码分析

    目录 前言 正文 <WebRTC工作原理精讲>系列-总览_liuzhen007的专栏-CSDN博客_webrtc 原理前言欢迎大家订阅Data-Mining 的<WebRTC工作原理 ...

  6. Java 中 Integer 源码学习之缓存池了解

    Java 中 Integer 源码学习之缓存池了解 面试题 new Integer(123) 与 Integer.valueOf(123) 的区别? new Integer(123) 每次都会新建一个 ...

  7. Linux中C语言标准库glibc源码下载

    在这篇文章理清gcc.libc.glibc.libc++.libstdc++的关系,我们大概理解了libc,glibc之间的一些关系. 下面我们就开了解一些Linux中C语言标准库glibc源码. 在 ...

  8. mysql src.rpm_从.src.rpm包中提取出完整的源码的方法

    1 什么是完整的源码 就是说,最初始的源码加上打了所有的patch后的源码,即最新的源码. 2 过程 2.1 从.src.rpm中提取完整的rpm工程文件 2.1.1 rpm to cpio rpm2 ...

  9. 13个Vue3中的全局API的源码浅析汇总整理

    前言 不知不觉vue-next的版本已经来到了3.1.2,最近对照着源码学习vue3的全局Api,边学习边整理了下来,希望可以和大家一起进步. 我们以官方定义.用法.源码浅析三个维度来一起看看它们.下 ...

  10. postgresql源码学习(57)—— pg中的四种动态库加载方法

    一. 基础知识 1. 什么是库 库其实就是一些通用代码,可以在程序中重复使用,比如一些数学函数,可以不需要自己编写,直接调用相关函数即可实现,避免重复造轮子. 在linux中,支持两种类型的库: 1. ...

最新文章

  1. 树结构有什么好处_什么啊?面试官还在问HashMap了,老知识点了啊
  2. 让机器像人一样听音乐,Facebook开源Demucs项目
  3. C# 中 以 # 打头的 编码 是: html 编码解码地址 转换
  4. mysql浅拷贝_List的复制 (浅拷贝与深拷贝)
  5. iterm2 保存阿里云登陆并防止断开连接
  6. 手机游戏降低游戏延迟的软件_怎么降低手机网络延迟(减少网络延迟的5个小技巧)...
  7. 多变量逻辑回归python_Python实现逻辑回归(Logistic Regression in Python)
  8. centOS无法联网
  9. Visual studio 2012 创建web service
  10. 鸟哥的私房菜-基础篇学习-文件与目录管理-2-1
  11. P1018 乘积最大(高精度加/乘)
  12. 高能!一大波奇葩挖矿方式来袭~
  13. IC - 什么是数字IC设计?
  14. library(igraph)
  15. 移动平台开发工程训练
  16. Android 折叠屏技术发展与适配
  17. 插件加载导致outlook崩溃
  18. Concurnas语言利用JVM开发高性能应用程序
  19. [ubuntu20]查看是否是固态硬盘
  20. netHunter Bluetooth Arsenal(蓝牙攻武器库)

热门文章

  1. rsync与cwRsync
  2. 跨境电商亚马逊产品运营模式都有哪些
  3. 计算机网络水平子系统布线图,综合布线七大子系统构成图
  4. 抖音protobuf分析
  5. labwindows的学习资料、方法、安装包
  6. 浏览器请求web服务器的过程
  7. 手把手教你 | 识别色环电阻/贴片电阻阻值
  8. ArcGIS之栅格地图配准
  9. JavaScript应用程序开发(游娱平台)
  10. AutoCAD中导入图片