目录
2.4、形象理解ObservableSource和Publisher有何异同
开篇
开始学习RxJava的时候忘记所有,仅仅就学习RxJava,单独看待,不需要和Retrofit等等其它库结合使用,当我们明白RxJava的操作符等一些列api怎么使用在什么场景下使用后再来结合Retrofit来进行网络请求等,这样或许会更加清晰点。
RxJava2 的5大基类及本章学习结构图
1、Flowable
1.1、Flowable简介
Flowable类,用于实现Reactive-Streams模式,并提供工厂方法,中间运算符以及使用反应式数据流的能力。
Reactive-Streams使用Flowable运行,Flowable实现了Publishers。因此,许多运算符直接接受Publishers,并允许与其他Reactive-Streams的实现进行直接交互操作
public abstract class Flowable<T> implements Publisher<T>
Flowable为操作符提供128个元素的默认缓冲区大小,可通过bufferSize() 方法获取,可通过系统参数rx2.buffer-size全局覆盖。但是大多数运算符都有重载,允许显式设置其内部缓冲区大小。
/** The default buffer size. */
static final int BUFFER_SIZE;
static {
BUFFER_SIZE = Math.max(16, Integer.getInteger("rx2.buffer-size", 128));
}
/**
* Returns the default internal buffer size used by most async operators.
* <p>The value can be overridden via system parameter {@code rx2.buffer-size}
* <em>before</em> the Flowable class is loaded.
* @return the default internal buffer size.
*/
public static int bufferSize() {
return BUFFER_SIZE;
}
1.2、Flowable官方图解
1)看到上图有点疑问,不是在说Flowable嘛,怎么图解里的说明是Observable呢?
2)其实在官方文档里面Flowable和Observable都使用的是上面这个图解,因此这两个类肯定是提供相似功能,既然是相似,那么这幅图就是他们的共性,那不同的地方是什么呢?
不同之处是:Flowable支持Backpressure,Observable不支持Backpressure;
3)Backpressure什么是?
看下面1.3节
1.3、Backpressure
Backpressure中文翻译过来是背压,这里推荐一篇很好的关于Backpressure说明的博客:关于RxJava最友好的文章——背压(Backpressure)
下面关于背压的说明是出自拉丁吴博客的内容,写的很通俗易懂
RxJava是一个观察者模式的架构,当这个架构中被观察者(Observable)和观察者(Subscriber)处在不同的线程环境中时,由于者各自的工作量不一样,导致它们产生事件和处理事件的速度不一样,这就会出现两种情况:
- 被观察者产生事件慢一些,观察者处理事件很快。那么观察者就会等着被观察者发送事件,(好比观察者在等米下锅,程序等待,这没有问题)。
- 被观察者产生事件的速度很快,而观察者处理很慢。那就出问题了,如果不作处理的话,事件会堆积起来,最终挤爆你的内存,导致程序崩溃。(好比被观察者生产的大米没人吃,堆积最后就会烂掉)。
下面我们用代码演示一下这种崩溃的场景:
//被观察者在主线程中,每1ms发送一个事件
Observable.interval(1, TimeUnit.MILLISECONDS)
//.subscribeOn(Schedulers.newThread())
//将观察者的工作放在新线程环境中
.observeOn(Schedulers.newThread())
//观察者处理每1000ms才处理一个事件
.subscribe(new Action1<Long>() {
@Override
public void call(Long aLong) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.w("TAG","---->"+aLong);
}
});
拉丁吴对Backpressure的定义是:
背压是指在异步场景中,被观察者发送事件速度远快于观察者的处理速度的情况下,一种告诉上游的被观察者降低发送速度的策略
简而言之,背压是流速控制的一种策略。
需要强调两点:
- 背压策略的一个前提是异步环境,也就是说,被观察者和观察者处在不同的线程环境中。
- 背压(Backpressure)并不是一个像flatMap一样可以在程序中直接使用的操作符,他只是一种控制事件流速的策略。
关于背压(Backpressure)的解释拉丁吴说的很清楚了,要了解更多关于这方面的信息可以移步他的博客:关于RxJava最友好的文章——背压(Backpressure)
2、Observable
2.1、Observable简介
Observable类是不支持背压的,Observable是Reactive的一个抽象基类,Observable提供工厂方法,中间运算符以及消费同步和/或异步数据流的功能。
Observable类中的多数运算符接受一个或者多个ObservableSource,ObservableSource是非背压的基本接口&#x