1. 程式人生 > >RxJava2 Flowable cache

RxJava2 Flowable cache

目錄

cache

cache

cache介面

cache()

返回一個惰性地訂閱此釋出者的Flowable,快取其所有事件,並按照收到的順序將它們重播給所有下游訂閱者。

返回一個惰性地訂閱此釋出者的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系列希望能幫助到看過的同學,不喜勿噴哈,謝謝!