参考:http://blog.csdn.net/jdsjlzx/article/details/51685769
http://blog.csdn.net/jdsjlzx/article/details/51686152
https://segmentfault.com/a/1190000004856071
https://gank.io/post/560e15be2dca930e00da1083
你真的会用RxJava么?RxJava线程变换之observeOn与subscribeOn
关注我的公众号,轻松了解和学习更多技术

转载请标明出处:http://blog.csdn.net/xx326664162/article/details/51967967 文章出自:薛瑄的博客你也可以查看我的其他同类文章,也会让你有一定的收货!为什么多次调用subscribeOn()却只有第一个起作用? 为什么多次调用observeOn()却可以切换到不同线程 observeOn()后能不能再次调用subscribeOn()?如果
RxJava简介
RxJava是现在大火的一个异步框架,他代码简洁好懂,功能强大,扩展性高,维护难度小。RxJava最吸引人的功能就是它的线程切换功能。在Android开发中,UI组件只能在主线程中进行,但是主线程中执行太复杂的逻辑又会导致APP卡顿,因此灵活的线程切换是一个安卓开发工程师的必会技能。RxJava提供了优秀的线程切换能力,能在不同的线程执行规定的逻辑代码。
这次就来聊一聊RxJ...
转载自安德雷士的RxJava线程切换——ObserveOn和SubscribeOn的区别
RxJava很优势的一个方面就是他的线程切换,基本是依靠ObserveOn和SubscribeOn这两个操作符来完成的。
先来看看什么是ObserveOn和SubscribeOn,官方对他们的定义是这样的:
ObserveOn
specify the Scheduler on which an observ...
RxJava 是一个响应式编程框架,里面代码比较复杂,本系列文章将从以下几个角度来分析这个框架。
1. RxJava 的链路调用流程。
2. RxJava 的常用操作符 `map、flatmap`。
3. RxJava 的线程调度。
4. 自己实现一个简易版的响应式框架。
observeOn
指定一个观察者在哪个调度器上观察这个Observable,当每次调用了ObservableOn这个操作符时,之后都会在选择的调度器上进行观察,直到再次调用ObservableOn切换了调度器。
多次使用 subscribeOn
//subscribeOn : 切换订阅...
RxJava有引以为傲的链式调用、海量的操作符、便捷的线程切换。如果找到一个入口同时了解三者,线程切换再合适不过了,它同时利用了三者的特性,又不至于内容过于琐碎繁杂。
RxJava切换线程的操作符总共只有两个:observeOn和subscribeOn:
observeOn用于切换观察者Observer的onNext执行线程
subscribeOn用于切换被观察者Observable的subscribe执行线程
如下这段代码就是本篇分析的重点,很好地体现了链式调用的特点:不加分号,一点到底。(为了减小
public ObservableObserveOn(ObservableSource<T> source, Scheduler scheduler, boolean delayError, int bufferSize) {
super(source);
this.scheduler = scheduler;
this.delayError = delayError;
从上图中,我们可以看出,observeOn主要作的工作是:
1,通过指定的scheduler来切换线程,用来emit数据,这个数据就是onNext(data)方法的参数。
2,emit出来的数据,先异步的缓存到一个buffer,实际上是缓存到了一个Queue中。
3,通过指定的scheduler来异步的消费Q
//获取当前的线程name(是主线程还是异步线程)
private String getCurrentThread() {
return Thread.currentThread().getName();
1.默认线程
上下游默认都是主线程
2.为上游设置异步线程,下游设置主线程
//上游配置异步线程,下游配置主线程,RxJava内部是一个线程池
Observable.create
使用RxJava的subscribeOn和observeOn可以方便地进行线程切换,但我发现很多人由于对subscribeOn的理解不到位,在使用中会发生意想不到的bug。
subscribeOn
提起subscribeOn,很多人都知道它可以用来切换上游线程,且只有第一次生效。这种理解明显是带有错误的,看一段代码
val observable = Observable.create<Int> { emitter ->
log("Subscribing")
thread(.