技术标签: RxJava subscribeOn RxJava探析 Observable ObserveOn
RxJava的特色就是可以改变他的任务线程,可以很优雅的在子线程和主线程中切换,而切换用到的两个主要方法是subscribeOn()和observeOn().
备注:因本人水平有限,以下分析只代表本人所见,如有不当,请见谅并指出。
在分析之前,首先要明确一点,不然会产生思路混乱。
当我们调用了Observable.subscribe()方法,发生了什么????
总结性的说:创建Subscriber对象,调用OnSubscribe对象的call方法。注意,Subscriber什么都没做,Subscriber什么都没做,Subscriber什么都没做。重要的事情说三遍,下面开始分析。
首先,我们写一个例子:
Observable
.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
subscriber.onNext("a");
subscriber.onNext("b");
subscriber.onCompleted();
}
})
.subscribeOn(Schedulers.io())
.subscribe(new Observer<String>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(String integer) {
System.out.println(integer);
}
});
这个例子很简单,但在intellij 中运行,不打印任何东西,但在ecplise中确没问题。打印如下:
a
b
这个问题我也搞不清为什么,如果有知道的欢迎留言。
老套路,我们看一下subscribeOn()中,都干了什么
public final Observable<T> subscribeOn(Scheduler scheduler) {
if (this instanceof ScalarSynchronousObservable) {
return ((ScalarSynchronousObservable<T>)this).scalarScheduleOn(scheduler);
}
return create(new OperatorSubscribeOn<T>(this, scheduler));
}
很明显,会走if之外的方法。
在这里我们可以看到,我们又创建了一个Observable对象,但创建时传入的参数为OperatorSubscribeOn(this,scheduler)
,我们看一下此对象以及其对应的构造方法
public final class OperatorSubscribeOn<T> implements OnSubscribe<T> {
final Scheduler scheduler;
final Observable<T> source;
public OperatorSubscribeOn(Observable<T> source, Scheduler scheduler) {
this.scheduler = scheduler;
this.source = source;
}
@Override
public void call(final Subscriber<? super T> subscriber) {
//......暂时省略
}
}
可以看到,OperatorSubscribeOn
实现
文章浏览阅读615次。来自: http://www.it165.net/pro/html/201211/4070.html有段时间没更新博客了,最近一直忙项目,下面就把我最近的新成果给大家分享一下。近段时间主要是在研究开发工具与游戏制作的结合,大家知道工欲善其事必先利其器,一款好的方便的开发工具能够极大的提高游戏的开发效率,特别是在制作关卡这些东西的时候,这也就是为什么国外现在有这么多的开发_tilemap 编辑器 编辑高度
文章浏览阅读3.4k次。为什么80%的码农都做不了架构师?>>> ..._-nostartfiles
文章浏览阅读1.8w次。在新系统中正确安装QQ2010无法运行,同时安装的TM2009也无法运行。同样显示为“应用程序无法正常启动(0xc0150002)。请单击“确定”关闭应用程序”。在百度,Google中搜索中发现有许多人遇到了同样的问题,而且软件也不限于腾讯软件,有摄像头、CAD的各种软件。 打开查看后发现大多数答案并不正确,也无法解决这个问题。经过我的研究以上软件,发现_win7应用程序无法正常启动0xc0150002解决方法
文章浏览阅读753次。前言字符串匹配这样一个功能,对于任何一个开发工程师来说,应该都不会陌生。我们用的最多的就是编程语言所提供的字符串查找函数,比如 Java 中的 indexOf(),Python 中的 find() 函数等,它们底层就是依赖字符串匹配算法。字符串匹配算法很多,两种比较简单的、比较好理解的是:BF 算法和 RK 算法。比较难理解、但更加高效的有:BM 算法和 KMP 算法。这四种都是单模式串匹配算法...
文章浏览阅读2.2w次,点赞8次,收藏54次。JVM常用基础参数-栈内存Xss讲解大厂面试题:1、JVM垃圾回收时候如何确定垃圾?是否知道什么是GC Roots2、你说你做过JVM参数调优和参数配置,请问如何盘点查看JVM系统默认值3、你平时工作中用过的JVM常用基本配置参数有哪些?4、强引用、软引用、弱引用、虚引用费别是什么?5、请你谈谈对OOM的认识6、GC垃圾回收算法与垃圾收集器的关系?分别是什么请你谈谈?..._jvm xss
文章浏览阅读73次。在网页设计和开发中,滑动门(sliding doors)和选项卡(tabs)是常用的交互效果,它们可以为网页添加动态和互动性。本文将介绍如何使用jQuery库实现多滑动门和多选项卡效果,并提供相应的源代码。通过绑定合适的事件和操作DOM元素的CSS类,我们可以为网页添加动态和交互性。的元素上时,它的宽度会从100像素动画缓慢地增加到200像素,持续时间为300毫秒。选项卡效果常用于切换不同内容或功能区域,用户可以通过点击选项卡来显示相应的内容。标签中,多个具有相同类名的选项卡将具备切换显示内容的效果。_jquery滑动门
文章浏览阅读426次。1. 晶振与晶体的区别1) 晶振是有源晶振的简称,又叫振荡器。英文名称是oscillator。晶体则是无源晶振的简称,也叫谐振器。英文名称是crystal.2) 无源晶振(晶体)一般是直插两个脚的无极性元件,需要借助时钟电路才能产生振荡信号。常见的有49U、49S封装。3) 有源晶振(晶振)一般是表贴四个脚的封装,内部有时钟电路,只需供电便可产生振荡信号。一般分7050、5032、3225、252..._晶体 电阻 大小
文章浏览阅读3.9k次。背景:2013年8月,微信红包上线。2014年春节微信红包引爆社交支付。2015年春晚红包摇一摇,推动微信红包在全国迅速普及。此后,每逢节假日或特殊日子,人们都会自主的兴起发红包,使微信红包成为热点。微信红包的火热带动微信支付的迅猛发展,按当时的发展速度预估,到2015年底,每天的微信支付交易记录会达到20亿。而原有的用户交易记录存储系统无法承受业务迅猛发展带来的冲击,一些瓶颈逐渐凸显出来。本文将_微信支付交易量如何存储
文章浏览阅读1.6k次。上图中的“Automatically log session input to file in :”勾选后选定地址即可_iterm log plain text
文章浏览阅读1.6w次。提示“用户已取消该操作的”解决办法_vm用户已取消该操作
文章浏览阅读2.6w次,点赞12次,收藏98次。获取文件路径基本方法_python获取文件路径
文章浏览阅读1w次。三范式是BC范式的放宽 三范式条件(满足一个即可): 1. α–>β是平凡的函数依赖,除了子集和父集的函数依赖,大多的函数依赖都是非平凡的 2. α是关系模式R的一个超码 3. (β-α)属性集里的所有属性都被包含在 R的candidate key里,注意 (β-α)的属性集里的所有元素,可以 分别被包含在多个 candidate key中三范式分解算法伪代码如下://在关..._三范式分解算法