RxJava2 Flowable cache
目录
cache
cache接口
Flowable<T> |
cache()
返回一个惰性地订阅此发布者的Flowable,缓存其所有事件,并按照收到的顺序将它们重播给所有下游订阅者。 |
Flowable<T> |
cacheWithInitialCapacity(int initialCapacity)
返回一个惰性地订阅此发布者的Flowable,缓存其所有事件,并按照收到的顺序将它们重播给所有下游订阅者,并可以通过 |
cache图解说明
这幅图形象的说明了cache的作用,cache不会影响源的发射,只是会缓存发射项目,然后构造一个新的Flowable,将缓存的项目一次性发射出来
cache 测试用例
测试代码
@Test
public void cache() {
System.out.println("######cache#####");
Flowable.just(10, 22, 13, 74, 52)
.cache()
.subscribe(new Consumer<Integer>() {
@Override
public void accept(Integer integer) throws Exception {
System.out.println("integer=" + integer);
}
});
}
@Test
public void cacheWithInitialCapacity() {
System.out.println("######cacheWithInitialCapacity#####");
Flowable.just(10, 22, 13, 74, 52).cacheWithInitialCapacity(1).subscribe(new Consumer<Integer>() {
@Override
public void accept(Integer integer) throws Exception {
System.out.println("integer=" + integer);
}
});
}
测试结果
######cacheWithInitialCapacity#####
integer=10
integer=22
integer=13
integer=74
integer=52
cache 测试用例分析
其实cache也是直接调用了cacheWithInitialCapacity返回的,所以上面就直接使用cacheWithInitialCapacity来测试 。
从上面的测试效果来看,看不出来cache与Flowable直接使用有何不同,实际上就是用来做缓存用的,调用了cache(),会把发射的项目缓存下来,并可以设置缓存空间大小,然后根据缓存再创建一个Flowable返回
下面是Flowable节选的源码
源码
@CheckReturnValue
@BackpressureSupport(BackpressureKind.FULL)
@SchedulerSupport(SchedulerSupport.NONE)
public final Flowable<T> cache() {
return cacheWithInitialCapacity(16);
}
@CheckReturnValue
@BackpressureSupport(BackpressureKind.FULL)
@SchedulerSupport(SchedulerSupport.NONE)
public final Flowable<T> cacheWithInitialCapacity(int initialCapacity) {
ObjectHelper.verifyPositive(initialCapacity, "initialCapacity");
return RxJavaPlugins.onAssembly(new FlowableCache<T>(this, initialCapacity));
}
注意这里传入的int值必须大于0,否则会报错:java.lang.IllegalArgumentException: initialCapacity > 0 required but it was 0
cache实用场景
实在是时间不够用,后续完善
国庆假期过得太快,实在是时间不够用,写作是个长期的过程,RxJava系列希望能帮助到看过的同学,不喜勿喷哈,谢谢!