RxJava2 Flowable cache

目录

cache

cache接口

cache图解说明

cache 测试用例

cache 测试用例分析

cache实用场景


cache

cache接口

Flowable<T> cache()

返回一个惰性地订阅此发布者的Flowable,缓存其所有事件,并按照收到的顺序将它们重播给所有下游订阅者。

Flowable<T> cacheWithInitialCapacity(int initialCapacity)

返回一个惰性地订阅此发布者的Flowable,缓存其所有事件,并按照收到的顺序将它们重播给所有下游订阅者,并可以通过initialCapacity设置提示要缓存的项目数(用于优化基础数据结构)

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系列希望能帮助到看过的同学,不喜勿喷哈,谢谢!

猜你喜欢

转载自blog.csdn.net/weixin_36709064/article/details/82937041